在項目當中使用數據庫時,因爲需求的增長,所以不可避免地要在原有的數據庫當中增長新的字段,這時候就要在SQLiteOpenHelper
的onUpgrade
方法進行處理,關於SQLiteOpenHelper
的內部實現原理,能夠參考以前的這篇文章:Android 數據存儲知識梳理(1) - SQLiteOpenHelper 源碼解析,今天咱們主要介紹當數據庫的結構更新以後應當如何操做。數據庫
首先,咱們介紹一下整個需求的背景:bash
1.0
,設置數據庫的版本號爲1
,建立表firstTable
。1.1
,因爲需求變動,須要建立表secondTable
,此時secondTable
的表中的字段爲column1
。1.2
,因爲需求變動,須要在secondTable
中新增一列column2
。在第一個版本時,咱們建立一個數據表first_table
,代碼以下:ide
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
方法當中: spa
當安裝第二個版本的時候,咱們有兩種狀況:code
first_table
,也就是不存在table.db
。first_table
,也就是table.db
的版本號爲1
。這時候,咱們就要對DBHelper
修改,和第一個版本相比,修改的地方如紅框所示: ip
onCreate
,不執行onUpgrade
,這時候就會建立兩個表:
onUpgrade
,不執行onCreate
:
此時的數據庫結構爲:
前面兩步都沒有問題,那麼接下來就是安裝第三個版本,在第三個版本中咱們須要在second_table
中增長一個新的字段column2
,那麼這時候就有如下三種狀況:get
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
列。此時的數據庫結構爲: string
以上就是對於數據庫進行修改後的更新策略,每更新一個版本以後,咱們須要作如下幾件事:it
1
。onCreate
方法中,定義建立數據庫表的語句,它對應於表的最新結構。onUpgrade
的switch
方法的最後,新增一條case
語句,該case
語句的內容爲其相對於上個數據庫版本所要進行的變動操做。