Android 資料儲存知識梳理(4) 資料庫升級操作的處理策略

澤毛發表於2017-12-21

一、前言

在專案當中使用資料庫時,由於需求的增加,因此不可避免地要在原有的資料庫當中增加新的欄位,這時候就要在SQLiteOpenHelperonUpgrade方法進行處理,關於SQLiteOpenHelper的內部實現原理,可以參考之前的這篇文章:Android 資料儲存知識梳理(1) - SQLiteOpenHelper 原始碼解析,今天我們主要介紹當資料庫的結構更新之後應當如何操作。

二、示例

首先,我們介紹一下整個需求的背景:

  • 第一個版本:應用版本為1.0,設定資料庫的版本號為1,建立表firstTable
  • 第二個版本:應用版本為1.1,由於需求變更,需要建立表secondTable,此時secondTable的表中的欄位為column1
  • 第三個版本:應用版本為1.2,由於需求變更,需要在secondTable中新增一列column2

2.1 第一個版本

在第一個版本時,我們建立一個資料表first_table,程式碼如下:

public class DBHelper extends SQLiteOpenHelper {

    private static final String TAG = "DBHelper";

    private static final String DB_NAME = "table.db";
    private static final int DB_VERSION = 1;

    private static final String CREATE_FIRST_TABLE = "create table if not exists first_table ("
            + "id integer primary key,"
            + "column1 integer)";

    public DBHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.d(TAG, "onCreate");
        db.execSQL(CREATE_FIRST_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        Log.d(TAG, "oldVersion=" + oldVersion + ",newVersion=" + newVersion);
    }
}
複製程式碼

當我們第一次安裝該版本的應用,此時由於沒有建立過該資料庫,因此會走到onCreate方法當中:

Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略
此時的資料庫結構為:
Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略

2.2 第二個版本

當安裝第二個版本的時候,我們有兩種情況:

  • 使用者資料庫中沒有first_table,也就是不存在table.db
  • 使用者資料庫中有first_table,也就是table.db的版本號為1

這時候,我們就要對DBHelper修改,和第一個版本相比,修改的地方如紅框所示:

Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略
針對前面說到的兩種情況,整個執行的過程為:

  • 沒有安裝或者執行過第一個版本,執行的onCreate,不執行onUpgrade,這時候就會建立兩個表:
    Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略
  • 安裝過第一個版本並且執行,執行onUpgrade,不執行onCreate
    Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略
    此時的資料庫結構為:
    Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略

2.3 第三個版本

前面兩步都沒有問題,那麼接下來就是安裝第三個版本,在第三個版本中我們需要在second_table中增加一個新的欄位column2,那麼這時候就有以下三種情況:

  • 使用者的資料庫中沒有任何一個表,即不存在table.db
  • 使用者的資料庫中只有first_tabletable.db的版本為1
  • 使用者的資料庫中有first_tablesecond_tabletable.db的版本號為2

因此,我們就要對DBHelper類進行如下的修改:

Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略
針對於上面談到的三種情況,執行的流程分別為:

  • 只執行onCreate方法,直接建立帶有column1/column2second_table
  • 只執行onUpgrade方法,因為我們的oldVersion1,因此先走到第一個case語句,建立帶有column1second_table,由於該case語句沒有break,因此接著會走到第二個case語句,在second_table中增加column2列。
  • 只執行onUpgrade方法,此時的oldVersion2,因此會直接執行第二個case語句,新增column2列。

此時的資料庫結構為:

Android 資料儲存知識梳理(4)   資料庫升級操作的處理策略

三、小結

以上就是對於資料庫進行修改後的更新策略,每更新一個版本之後,我們需要做以下幾件事:

  • 將資料庫版本加1
  • onCreate方法中,定義建立資料庫表的語句,它對應於表的最新結構。
  • onUpgradeswitch方法的最後,新增一條case語句,該case語句的內容為其相對於上個資料庫版本所要進行的變更操作。

更多文章,歡迎訪問我的 Android 知識梳理系列:

相關文章