Android SQLite資料庫版本升級原理解析,androidsqlite

來源:互聯網
上載者:User

Android SQLite資料庫版本升級原理解析,androidsqlite

Android使用SQLite資料庫儲存資料,那資料庫版本升級是怎麼回事呢,這裡說一下。

一、軟體v1.0

安裝v1.0,假設v1.0版本只有一個account表,這時走繼承SQLiteOpenHelper的onCreate,不走onUpgrade。

1、v1.0(直接安裝v1.0)

二、軟體v2.0

有2種安裝軟體情況:

1、v1.0   -->  v2.0              不走onCreate,走onUpgrade

2、v2.0(直接安裝v2.0)          走onCreate,不走onUpgrade

v1.0版本只有一個account表,軟體版本升級到v2.0了,但是v2.0資料庫需要新增一個member表,那怎麼辦呢?這裡有2種情況了:一種是安裝了v1.0升級到v2.0,這時不會走繼承SQLiteOpenHelper的onCreate,而是直接走onUpgrade,這時就要在onUpgrade添加member表的代碼了,在onCreate加了也沒用,因為這種情況都不走onCreate。。另一種情況就是使用者從來沒有安裝過這個軟體,直接安裝v2.0,這時走繼承SQLiteOpenHelper的onCreate,不走onUpgrade,所以要在onCreate添加member表的代碼。這怎麼辦呢?這就要合理升級資料庫版本了。

三、軟體v3.0

假設v3.0又新增一個news表,這裡有三種情況:

1、v1.0   -->  v3.0              不走onCreate,走onUpgrade

2、v2.0   -->  v3.0              不走onCreate,走onUpgrade

3、v3.0(直接安裝v3.0)          走onCreate,不走onUpgrade

那資料庫添加表語句在那裡寫呢?資料庫有一個版本號碼用DATABASE_VERSION表示

其實想一下,就知道不是onCreate寫就是onUpgrade寫,就是要相容各種情況下安裝app,都能把資料庫表添加進去就好了。這裡很巧妙:

1、v1.0     DATABASE_VERSION=1000    onCreate      --添加--  account

2、v2.0     DATABASE_VERSION=1001    onCreate      --添加--  account  (v1.0代碼不變)  onUpgrade(DATABASE_VERSION>1000)

                                                       onUpgrade   --添加--  member 

3、v3.0     DATABASE_VERSION=1002    onCreate      --添加--  account  (v1.0代碼不變)  onUpgrade(DATABASE_VERSION>1001)

                                                       onUpgrade   --添加--  member (v2.0代碼不變)

                                                       onUpgrade   --添加--  news

這樣就可以解決問題了,第一版本的都在onCreate,其他版本新增的在onUpgrade,而且在onCreate執行onUpgrade。做判斷是否執行onUpgrade該怎麼判斷呢,所以有了資料庫版本的概念了,DATABASE_VERSION儲存當前的資料庫版本,只要當前的資料庫版本比已經安裝的資料庫版本大時,就進入onUpgrade,這時還會把上一個資料庫版本號碼(oldVersion)跟安裝的資料庫版本號碼(newVersion)做比較,不同的DATABASE_VERSION添加自己所需要的表(跨版本升級資料庫)。

下面做一個簡單的執行個體:

(1)、V1.0  : DATABASE_VERSION = 1000 添加一個favorite表

public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mall.db";      private static final int DATABASE_VERSION = 1000;    private static DBHelper instance = null;public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}public synchronized static DBHelper getInstance(Context context) {if (instance == null) {instance = new DBHelper(context);}return instance;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL.CREATE_TABLE_FAVORITE);// 若不是第一個版本安裝,直接執行資料庫升級// 請不要修改FIRST_DATABASE_VERSION的值,其為第一個資料庫版本大小final int FIRST_DATABASE_VERSION = 1000;onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 使用for實現跨版本升級資料庫for (int i = oldVersion; i < newVersion; i++) {switch (i) {default:break;}}}}

其中SQL.java是建表語句

public class SQL {    public static final String T_FAVORITE = "favorite";    public static final String CREATE_TABLE_FAVORITE =            "CREATE TABLE IF NOT EXISTS " + T_FAVORITE + "(" +                    "id VARCHAR PRIMARY KEY, " +                    "title VARCHAR, " +                    "url VARCHAR, " +                    "createDate VARCHAR " +                    ")";}

(2)、V2.0  : DATABASE_VERSION = 1001 在favorite表添加1個deleted欄位

public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mall.db";      private static final int DATABASE_VERSION = 1001;    private static DBHelper instance = null;public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}public synchronized static DBHelper getInstance(Context context) {if (instance == null) {instance = new DBHelper(context);}return instance;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL.CREATE_TABLE_FAVORITE);// 若不是第一個版本安裝,直接執行資料庫升級// 請不要修改FIRST_DATABASE_VERSION的值,其為第一個資料庫版本大小final int FIRST_DATABASE_VERSION = 1000;onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 使用for實現跨版本升級資料庫for (int i = oldVersion; i < newVersion; i++) {switch (i) {case 1000:upgradeToVersion1001(db);break;default:break;}}}private void upgradeToVersion1001(SQLiteDatabase db){// favorite表新增1個欄位String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN deleted VARCHAR";db.execSQL(sql1);}}

(3)、V3.0  : DATABASE_VERSION = 1002 在favorite表添加message和type欄位

public class DBHelper extends SQLiteOpenHelper {private static final String DATABASE_NAME = "mall.db";      private static final int DATABASE_VERSION = 1002;    private static DBHelper instance = null;public DBHelper(Context context) {super(context, DATABASE_NAME, null, DATABASE_VERSION);}public synchronized static DBHelper getInstance(Context context) {if (instance == null) {instance = new DBHelper(context);}return instance;}@Overridepublic void onCreate(SQLiteDatabase db) {db.execSQL(SQL.CREATE_TABLE_FAVORITE);// 若不是第一個版本安裝,直接執行資料庫升級// 請不要修改FIRST_DATABASE_VERSION的值,其為第一個資料庫版本大小final int FIRST_DATABASE_VERSION = 1000;onUpgrade(db, FIRST_DATABASE_VERSION, DATABASE_VERSION);}@Overridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// 使用for實現跨版本升級資料庫for (int i = oldVersion; i < newVersion; i++) {switch (i) {case 1000:upgradeToVersion1001(db);break;case 1001:upgradeToVersion1002(db);break;default:break;}}}private void upgradeToVersion1001(SQLiteDatabase db){// favorite表新增1個欄位String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN deleted VARCHAR";db.execSQL(sql1);}private void upgradeToVersion1002(SQLiteDatabase db){// favorite表新增2個欄位,添加新欄位只能一個欄位一個欄位加,sqlite有限制不予許一條語句加多個欄位String sql1 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN message VARCHAR";String sql2 = "ALTER TABLE "+SQL.T_FAVORITE+" ADD COLUMN type VARCHAR";db.execSQL(sql1);db.execSQL(sql2);}}

就是這樣,無論v1.0升級到v3.0,或者v2.0升級到3.0,還是v3.0直接安裝,安裝後的v3.0資料庫結構都是一樣的,理解透徹就是好啊,剛做sqlite資料庫的肯定會遇到這些問題,所以在這裡詳細地寫了一下,不過還是要注意一下,就是onUpgrade升級時候一定要寫對,測試好,不然安裝後的資料庫都有問題就麻煩了。

本人原創,轉寄請附上連結:http://www.cnblogs.com/liqw/p/4264925.html

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.