標籤:
本周著手開發資料同步的功能,但首先要解決的就是sqlite資料庫升級的問題,關於資料庫升級有蠻多方面涉及到,也許你是新增加了功能,所以建立了表,也許你為某些表增加了些欄位,也許你是重構了資料模型與資料結構,不管如何升級,必須要滿足使用者正常升級的情況下原來的資料不會丟失。關於正確的資料庫升級做法網上資料比較少,這次就來介紹下看到的國外一位大牛總結的資料庫升級的正確做法。
Version 1 of your database
大多數我們都是用android提供的SQLiteOpenHelper來建立和管理資料庫,如下代碼:
public class DbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mysample.db"; private static final int DATABASE_VERSION = 1; private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32);"; public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE_SAMPLE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // Do nothing for now }}
上述代碼每次執行的時候都會檢查目前的版本的資料庫是否存在,如果不存在則會執行onCreate方法來建立新的資料庫,然後會把資料庫的名字和版本號碼儲存起來;如果已經存在,則會比較目前的版本和DATABASE_VERSION的大小,然後就會去執行onUpgrade方法。
Version 2 of your database
問題是,最好的處理升級的方法是什麼,這裡認為最好的方法是迴圈處理每一個版本的資料庫變化,看樣本:
假設下一版本想為tblSample表新增一個“address”的欄位,新的建立語句應該像這樣:
CREATE TABLE tblSample( _id integer primary key autoincrement, name varchar(32), address varchar(128));
那麼看下新的代碼會是什麼樣的:
public class DbHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "mysample.db"; private static final int DATABASE_VERSION = 2; private static final String DATABASE_CREATE_SAMPLE_TABLE = "CREATE TABLE tblSample (_id integer primary key autoincrement, name varchar(32), address varchar(128);"; public DbHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); } @Override public void onCreate(SQLiteDatabase database) { database.execSQL(DATABASE_CREATE_SAMPLE_TABLE); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { for (int i = oldVersion; i < newVersion; i++) { switch (i) { case 1: db.execSQL("ALTER TABLE tblSample ADD address varchar(128)"); break; } } }}
代碼邏輯很簡單,就是一個for迴圈加上switch…case…語句,然後上述代碼卻能處理所有的資料庫升級,不管你是從版本1升級到版本9也好,還是從版本4升級到版本5也好,都可以從容的解決,確切的說,它將能解決從之前的所有版本升級到當前最新的版本。
須要說明的是,如果有些莫名其妙的使用者從高版本升級到低版本(確切的說是降級),例如從版本3不小心降級到版本1了,這種情況下如果只是有了上述代碼則就會拋出異常,造成系統崩潰。android中資料庫降級則會執行onDowngrade方法,為防止有這種情況發生,同樣須要重新這個方法防止程式的異常。
Android Sqlite Database Upgrade