一、前言
在專案當中使用資料庫時,由於需求的增加,因此不可避免地要在原有的資料庫當中增加新的欄位,這時候就要在SQLiteOpenHelper
的onUpgrade
方法進行處理,關於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
方法當中:
2.2 第二個版本
當安裝第二個版本的時候,我們有兩種情況:
- 使用者資料庫中沒有
first_table
,也就是不存在table.db
。 - 使用者資料庫中有
first_table
,也就是table.db
的版本號為1
。
這時候,我們就要對DBHelper
修改,和第一個版本相比,修改的地方如紅框所示:
- 沒有安裝或者執行過第一個版本,執行的
onCreate
,不執行onUpgrade
,這時候就會建立兩個表: - 安裝過第一個版本並且執行,執行
onUpgrade
,不執行onCreate
: 此時的資料庫結構為:
2.3 第三個版本
前面兩步都沒有問題,那麼接下來就是安裝第三個版本,在第三個版本中我們需要在second_table
中增加一個新的欄位column2
,那麼這時候就有以下三種情況:
- 使用者的資料庫中沒有任何一個表,即不存在
table.db
。 - 使用者的資料庫中只有
first_table
,table.db
的版本為1
。 - 使用者的資料庫中有
first_table
、second_table
,table.db
的版本號為2
。
因此,我們就要對DBHelper
類進行如下的修改:
- 只執行
onCreate
方法,直接建立帶有column1/column2
的second_table
。 - 只執行
onUpgrade
方法,因為我們的oldVersion
為1
,因此先走到第一個case
語句,建立帶有column1
的second_table
,由於該case
語句沒有break
,因此接著會走到第二個case
語句,在second_table
中增加column2
列。 - 只執行
onUpgrade
方法,此時的oldVersion
為2
,因此會直接執行第二個case
語句,新增column2
列。
此時的資料庫結構為:
三、小結
以上就是對於資料庫進行修改後的更新策略,每更新一個版本之後,我們需要做以下幾件事:
- 將資料庫版本加
1
。 - 在
onCreate
方法中,定義建立資料庫表的語句,它對應於表的最新結構。 - 在
onUpgrade
的switch
方法的最後,新增一條case
語句,該case
語句的內容為其相對於上個資料庫版本所要進行的變更操作。
更多文章,歡迎訪問我的 Android 知識梳理系列:
- Android 知識梳理目錄:www.jianshu.com/p/fd82d1899…
- 個人主頁:lizejun.cn
- 個人知識總結目錄:lizejun.cn/categories/