不會點SQLite,都很差意思說本身是開發的



1、爲何要會點SQLite?android

SQLite做爲一款輕量級的關係型數據庫,佔用的資源特別少,因此其應用場景也是特別的多。在移動開發中,咱們常常會有將數據存儲在本地的需求,此時SQLite將是咱們最佳的選擇。
可喜的是,SQLite已經被完美的集成在Android系統中,因此對於開發者而言,上手SQLite的難度又下降了很多。sql

2、開始玩玩SQLite數據庫

首先來講說在Android中操做SQLite數據庫的總體思路:app

一、自定義數據庫操做輔助類,並繼承自SQLiteOpenHelper類;
二、在Application中初始化SQLiteOpenHelper對象,並公開一個方法供其餘類調用獲取該對象;
三、根據SQLiteOpenHelper對象實例化SQLiteDatabase對象;
四、最後,咱們拿SQLiteDatabase對象便可進行SQLite數據庫的常規操做了。

其實整個流程並不複雜,稍微來點耐心,動動手指頭,再回頭瞧瞧SQLite,「哇哦,操做你如此簡單!」ide

一、自定義數據庫操做輔助類,並繼承自SQLiteOpenHelper類ui

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

/**
  * author:silencezwm on 16/6/20 06:43
  * email:silencezwm@gmail.com
  * description:數據庫操做輔助類
  */
public class DBHelper extends SQLiteOpenHelper {

    //數據庫名稱
    private static final String DBName = "study.db";
    //數據庫版本號
    private static final int DBVersion = 1;

    //構造方法
    public DBHelper(Context context) {
        super(context, DBName, null, DBVersion);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        //建立表---study
        db.execSQL("CREATE TABLE study ( _id integer PRIMARY KEY AUTOINCREMENT NOT NULL, bookName varchar, bookDesc varchar)");
    }

    /**
      * 數據庫版本更新
      * @param db            數據庫實例
      * @param oldVersion    舊版本號
      * @param newVersion    新版本號
      */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS study");
        onCreate(db);
    }
}

該類繼承了SQLiteOpenHelper,並實現了三個方法,其中onCreate()在數據庫初始化時會調用,onUpgrade()方法只有在數據庫新版本號大於舊版本號時纔會調用,即進行數據庫的更新操做。其中涉及到了經常使用SQL語句的書寫,看不懂的童鞋得抽空腦補一下這方面的知識哦。this

SQLiteOpenHelper有什麼用?.net

該SQLiteOpenHelper是Android平臺提供給咱們的數據庫輔助類,用於建立或打開數據庫。

二、在Application中初始化SQLiteOpenHelper對象,並公開一個方法供其餘類調用獲取該對象code

考慮到整個應用中的不一樣地方都有可能涉及到數據庫的操做,因此咱們有必要將該類的初始化放在咱們自定義的Application類中。就像該下:sqlite

public class MyApp extends Application {

    //數據庫輔助類實例
    private static DBHelper mDBHelper;

    @Override
    public void onCreate() {
        super.onCreate();
        mDBHelper = new DBHelper(getApplicationContext());
    }

    //返回DBHelper實例,
    public static DBHelper getmDBHelper(){
        return mDBHelper;
    }
}

咱們來看看初始化SQLiteOpenHelper類源碼的實現方式

public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
    this(context, name, factory, version, null);
}

參數含義解析:

context:上下文對象,這裏咱們傳入了ApplicationContext;
name:數據庫名稱,這裏咱們定義爲"study.db";
factory:操做數據庫後返回的默認Cursor對象,這裏咱們默認爲null,後續須要保存返回的Cursor對象時,本身再進行構造;
version:數據庫的版本號,初始版本號必須大於1,不然系統會拋IllegalArgumentException("Version must be >= 1, was " + version)異常。

三、根據SQLiteOpenHelper對象實例化SQLiteDatabase對象

該操做將會讓咱們獲得SQLiteDatabase對象,而一旦有了該對象,咱們就能夠進行數據庫的增刪改查操做了。該操做咱們能夠單獨封裝在某個類,一樣也能夠直接在某個Activity中實現。
核心代碼以下:

//獲取的數據庫對象
//其中 getWritableDatabase() 和 getReadableDatabase() 區別???
SQLiteDatabase db = MyApp.getmDBHelper().getWritableDatabase();
//SQLiteDatabase db = MyApp.getmDBHelper(). getReadableDatabase();

獲得SQLiteDatabase實例有以上兩種方法,兩種方法的主要區別在於:

在數據庫僅開放只讀權限或磁盤已滿時,getReadableDatabase只會返回一個只讀的數據庫對象。

另外在咱們每次初始化SQLiteDatabase對象時,系統都會進行數據庫版本號的判斷,該判斷的核心代碼以下(有興趣的童鞋能夠研究下getWritableDatabase()、getReadableDatabase()的源碼實現):

//獲取數據庫版本號,默認爲0
final int version = db.getVersion();
        //若是老版本號與新版本號不一樣
        if (version != mNewVersion) {
            //若是數據庫爲只讀,系統則會拋出"SQLiteException"異常
            if (db.isReadOnly()) {
                throw new SQLiteException("Can't upgrade read-only database from version " +
                        db.getVersion() + " to " + mNewVersion + ": " + mName);
        }

        //數據庫開啓事務
        db.beginTransaction();
        try {
            //表示數據庫第一次建立,則會進入咱們文章最上面自定義DBHelper類的onCreate()方法
            if (version == 0) {
                onCreate(db);
            } else {
            //若是舊版本號大於新版本號,數據庫會」降級「,不然數據庫會」升級「
                if (version > mNewVersion) {
                    onDowngrade(db, version, mNewVersion);
                } else {
                    onUpgrade(db, version, mNewVersion);
                }
            }
            //設置數據庫的最新版本號
            db.setVersion(mNewVersion);
            //事務成功完成
            db.setTransactionSuccessful();
        } finally {
                //最後結束事務
            db.endTransaction();
        }
    }

四、拿SQLiteDatabase對象進行SQLite數據庫的常規操做

該下簡略介紹兩種操做方法:

一、使用SQL語句
二、使用Android封裝好的方法

咱們在初始化SQLiteDatabase對象的時候,建立了一個數據庫:study.db,並在數據庫中建立了一個表:study,表中包含主鍵自增 _id , 還有兩個字段:bookName、bookDesc。
該下代碼實現了往數據庫中插入、更新、查詢、刪除四種經常使用操做,此時你應該親自動手試試...

//插入數據
    case R.id.btn_insert:
        //使用SQL語句
        if (useSQL) {
            db.execSQL("insert into study values(null, ?, ?)",
                    new Object[]{et_insert_book_name.getText().toString(), et_insert_book_desc.getText().toString()});

        //使用Android封裝的方法
        } else {
            //其中cv爲ContentValues的實例
            cv.put("bookName", et_insert_book_name.getText().toString());
            cv.put("bookDesc", et_insert_book_desc.getText().toString());

            long isOK = db.insert("study", null, cv);

            //-1表明操做失敗
            if (isOK == -1) {
                Toast.makeText(DBDemoActivity.this, "插入失敗", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(DBDemoActivity.this, "插入成功", Toast.LENGTH_SHORT).show();
            }
        }
        break;

    //更新數據
    case R.id.btn_update:

        if (useSQL) {
            db.execSQL("update study set bookName = ? where bookName = ?", new String[]{et_update_new_book_name.getText().toString(), et_update_book_name.getText().toString()});
        } else {
            cv.put("bookName", et_update_new_book_name.getText().toString());

            int updateCount = db.update("study", cv, "bookName = ?", new String[]{et_update_book_name.getText().toString()});

            //更新後更新的個數,"0"表示更新失敗
            if (updateCount != 0) {
                Toast.makeText(DBDemoActivity.this, "更新成功,共更新個數:" + updateCount, Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(DBDemoActivity.this, "更新失敗", Toast.LENGTH_SHORT).show();
            }
        }
        break;

    //查詢操做
    case R.id.btn_query:

        if (useSQL) {
            Cursor cursor = db.rawQuery("select * from study", null);
            StringBuilder sb = new StringBuilder();
            for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
                sb.append("總數:" + cursor.getCount() + "\\\\n" + "書名:" + cursor.getString(cursor.getColumnIndex("bookName"))
                        + "----該書簡介:" + cursor.getString(cursor.getColumnIndex("bookDesc")));
                text_query_result.setText(sb.toString());
            }
            //記得進行關閉哦
            cursor.close();
        } else {
            //查詢該表中全部數據
            Cursor c = db.query("study", null, null, null, null, null, null);

            StringBuffer sb = new StringBuffer();
            for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
                sb.append("總數:" + c.getCount() + "\\\\n" + "書名:" + c.getString(c.getColumnIndex("bookName"))
                        + "----該書簡介:" + c.getString(c.getColumnIndex("bookDesc")));
                text_query_result.setText(sb.toString());
            }
            //記得進行關閉哦
            c.close();

        }
        break;

    //刪除操做
    case R.id.btn_del:

        if (useSQL) {
            db.execSQL("delete from study where bookName = ?", new String[]{et_del_book_name.getText().toString()});
        } else {
            db.delete("study", "bookName = ?", new String[]{et_del_book_name.getText().toString()});
        }

        break;

3、SQLite說

」555...又被你看穿了「


相關文章
相關標籤/搜索