1. 程式人生 > >Android資料庫使用指南(下)

Android資料庫使用指南(下)

上一節中,我們講到了怎麼建立一個數據庫,以及對資料庫中對錶中的資料,進行增刪改查,主要操作的物件是表中的資料,這一章,我們將會講解怎麼對資料庫中的表進行操作。

那麼表可以做那些操作呢,比如刪除表啊,修改表中的某個欄位啊,新增表中的欄位啊,總之就是資料庫中的表,發生變化,除了剛剛說的那些變化,新增表也是變化之一。

那麼有人就問了,為什麼要對資料庫中對錶作變化啊,你想啊,假設我們建個表只想記名字和年齡,後來突然又說要把性別也記錄下來,但是之前的表已經存在了啊,難道還刪了重新建個表不成,肯定不行啊,刪了表資料就沒有了啊,所以要對資料庫作升級。

前言

上面已經說了,對錶進行修改,其實就是對資料庫進行升級,刪除表也算升級啊,反正就是發生變化,資料庫就需要升級。 所以老實說其實有個地方決定了資料庫的版本

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 ("
+ " _byte byte," + " _long long," + " _text text," + " _short short," + " _int int," + " _float float," + " _double double," + " _boolean boolean," + " _blob blob"
+ ")"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }

看看這個構造方法,其中第二個引數就是資料庫版本號,你可以在第一次釋出應用的時候,這個版本號填寫1,然後下一個版本,版本號填寫2,但是資料庫升級可沒有那麼簡單的單純改個數字就升級完畢了。

是時候好好的介紹一下onCreateonUpgrade方法了。

  • onCreate:在建立資料庫的時候,呼叫該方法,如果資料庫已經存在了,這個方法將不會被呼叫。

  • onUpgrade:當構造方法中的那個version,也就是資料庫版本升高了的時候,這個方法才會被呼叫。 比如,第一次釋出應用的時候,這裡的version是1,第二次釋出應用的時候,剛好資料庫要新建一個表,然後需要升級一下資料庫,這裡於是就傳遞了個2,這時候onUpgrade方法就會被呼叫了,不過onCreate方法可不會被呼叫了啊,因為資料庫已經存在了。

這裡有一點要提一下,資料庫只能升級,不能降級,不然會報錯的。

建立資料庫

上面大概說了,onCreateonUpgrade方法大概是在什麼時候被呼叫的,所以基於這個原理。如果我們要新增表或者修改表,我們就在onUpgrade方法中寫。這裡舉個例子,假設我們已經發布了資料庫版本為1的應用。 資料庫建立如下:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 (_text text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }

}

此時我們呼叫的方式為:

// 當前資料庫的版本為1
new DBHelper(context, 1)

其實我們就建立了一個表名為table1的表而已,不妨執行後來看看,資料庫檔案儲存在data/data/包名/databases/xxx.db

表也建立好了

看看錶中欄位

都沒有問題,接下來,我們開始升級資料庫,比如,新建表。

資料庫升級-新增表

接下來,我們新增一個表,所以就應該這樣寫:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 (_text text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        switch (newVersion) {
            case 1:
            case 2:
                // 新增表table2
                db.execSQL("create table table2 (_text text)");
                break;
        }

    }

}

所以在用的時候,就應該這樣用:

// 當前資料庫的版本為2
new DBHelper(context, 2)

看看?

沒啥問題

資料庫升級-刪除表

其實主要還是呼叫SQL語句執行任務,所以:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 (_text text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        switch (newVersion) {
            case 1:
            case 2:
                db.execSQL("create table table2 (_text text)");
            case 3:
                db.execSQL("drop table table2");
                break;
        }

    }

}

使用:

// 當前資料庫的版本為3
new DBHelper(context, 3)

資料庫升級-新增欄位

給某個表新增欄位:

public class DBHelper extends SQLiteOpenHelper {

    public static final String db_name = "test.db";

    public DBHelper(Context context, int version) {
        super(context, db_name, null, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("create table table1 (_text text)");
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        switch (newVersion) {
            case 1:
            case 2:
                db.execSQL("create table table2 (_text text)");
            case 3:
                db.execSQL("drop table table2");
            case 4:
                db.execSQL("alter table table1 ADD _long long");
                break;
        }

    }

}

使用:

// 當前資料庫的版本為4
new DBHelper(context, 4)

總結

大概差不多就是以這種方式對資料庫進行升級,這裡主要是使用sql語句對資料庫進行操作,如果對sql語句不熟悉的人,可能需要在使用前查詢一下了。 這裡大概說幾種常用的sql語句的結構:

新增表:

create table 表名 (欄位 型別)

刪除表:

drop table 表名

修改表-新增表字段

alter table 表名 add 欄位 型別

修改表-刪除欄位

alter table 表名 drop column 欄位名

SQLite支援正常的SQL語句,只需要呼叫SQLiteDatabase物件的execSQL方法就可以直接通過SQL語句對資料庫進行操作了

還有一點要說明的就是,為啥onUpgrade方法中的switch,不是每個case都對應一個break,這裡其實是一個小技巧,我們在使用資料庫升級的時候,往往switch這裡是這樣寫的:

    switch (newVersion) {
            case 1:
                // 更新1
            case 2:
                // 更新2
            case 3:
                // 更新3
            case 4:
                // 更新4
            case 5:
                // 更新5
            case 6:
                // 更新6
            case 7:
                // 更新7
            ...
                break;
        }

因為這樣寫有一個好處,假設我們的應用,最新版已經升級到第7個版本了,但是有的使用者還在用第4個版本,這時候,如果這個使用者直接升級到最新的第7版,這裡的執行,就會是

更新5
更新6
更新7

就把以前遺漏的更新全部趕上了,這就這樣寫的好處。

本章主要就是講資料庫升級,流程大概就是這麼個流程,就這樣吧!