Android 數據存儲知識梳理(4) 數據庫升級操做的處理策略

1、前言

在項目當中使用數據庫時,因爲需求的增長,所以不可避免地要在原有的數據庫當中增長新的字段,這時候就要在SQLiteOpenHelperonUpgrade方法進行處理,關於SQLiteOpenHelper的內部實現原理,能夠參考以前的這篇文章:Android 數據存儲知識梳理(1) - SQLiteOpenHelper 源碼解析,今天咱們主要介紹當數據庫的結構更新以後應當如何操做。數據庫

2、示例

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

  • 第一個版本:應用版本爲1.0,設置數據庫的版本號爲1,建立表firstTable
  • 第二個版本:應用版本爲1.1,因爲需求變動,須要建立表secondTable,此時secondTable的表中的字段爲column1
  • 第三個版本:應用版本爲1.2,因爲需求變動,須要在secondTable中新增一列column2

2.1 第一個版本

在第一個版本時,咱們建立一個數據表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

此時的數據庫結構爲:

2.2 第二個版本

當安裝第二個版本的時候,咱們有兩種狀況:code

  • 用戶數據庫中沒有first_table,也就是不存在table.db
  • 用戶數據庫中有first_table,也就是table.db的版本號爲1

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

針對前面說到的兩種狀況,整個執行的過程爲:

  • 沒有安裝或者運行過第一個版本,執行的onCreate,不執行onUpgrade,這時候就會建立兩個表:
  • 安裝過第一個版本而且運行,執行onUpgrade,不執行onCreate
    此時的數據庫結構爲:

2.3 第三個版本

前面兩步都沒有問題,那麼接下來就是安裝第三個版本,在第三個版本中咱們須要在second_table中增長一個新的字段column2,那麼這時候就有如下三種狀況:get

  • 用戶的數據庫中沒有任何一個表,即不存在table.db
  • 用戶的數據庫中只有first_tabletable.db的版本爲1
  • 用戶的數據庫中有first_tablesecond_tabletable.db的版本號爲2

所以,咱們就要對DBHelper類進行以下的修改: 源碼

針對於上面談到的三種狀況,執行的流程分別爲:

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

此時的數據庫結構爲: string

3、小結

以上就是對於數據庫進行修改後的更新策略,每更新一個版本以後,咱們須要作如下幾件事:it

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

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

相關文章
相關標籤/搜索