最快的作法是把舊的資料表刪除,然後重新建新的資料表,可是當我已經有廣大的使用者族群的時候,刪除舊資料對使用者來說是個災難性的體驗,所以這個方案在已經上線的app不太適用...
但如果再刪除之前,先把資料都存起來,這樣好像也滿複雜的,我只是想要把其中一個資料表增加欄位啊...
這裡查到一個不錯的作法,記錄於此備份一下,這裡的方法利用資料庫Transaction的功能。作法如下:
- 修改DBHelpler裡的資料庫版本,若原本是1,就要+1修改成2
- 一樣在onCreate()把最初建立的資料庫欄位做調整,程式碼範例:
//輔助類建立時運行該方法@OverridepublicvoidonCreate(SQLiteDatabase db) {String DATABASE_CREATE_TABLE ="create table newMemorandum("+"_ID INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,"+"date VARCHAR,"+"note VARCHAR,"+"pw VARCHAR,"+"reminder INT,"//新增欄位+"type VARCHAR,"//新增欄位+"memo VARCHAR"//新增欄位+")";db.execSQL(DATABASE_CREATE_TABLE);} - Overide函數 onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),程式碼範例如下:
@OverridepublicvoidonUpgrade(SQLiteDatabase db,intoldVersion,intnewVersion) {//oldVersion=舊的資料庫版本;newVersion=新的資料庫版本if(newVersion > oldVersion) {db.beginTransaction();//建立交易booleansuccess =false;//判斷參數//由之前不用的版本,可做不同的動作switch(oldVersion) {case1:db.execSQL("ALTER TABLE newMemorandum ADD COLUMN reminder integer DEFAULT 0");db.execSQL("ALTER TABLE newMemorandum ADD COLUMN type VARCHAR");db.execSQL("ALTER TABLE newMemorandum ADD COLUMN memo VARCHAR");oldVersion++;success =true;break;}if(success) {db.setTransactionSuccessful();//正確交易才成功}db.endTransaction();}else{onCreate(db);}}

沒有留言:
張貼留言