最快的作法是把舊的資料表刪除,然後重新建新的資料表,可是當我已經有廣大的使用者族群的時候,刪除舊資料對使用者來說是個災難性的體驗,所以這個方案在已經上線的app不太適用...
但如果再刪除之前,先把資料都存起來,這樣好像也滿複雜的,我只是想要把其中一個資料表增加欄位啊...
這裡查到一個不錯的作法,記錄於此備份一下,這裡的方法利用資料庫Transaction的功能。作法如下:
- 修改DBHelpler裡的資料庫版本,若原本是1,就要+1修改成2
- 一樣在onCreate()把最初建立的資料庫欄位做調整,程式碼範例:
//輔助類建立時運行該方法
@Override
public
void
onCreate(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),程式碼範例如下:
@Override
public
void
onUpgrade(SQLiteDatabase db,
int
oldVersion,
int
newVersion) {
//oldVersion=舊的資料庫版本;newVersion=新的資料庫版本
if
(newVersion > oldVersion) {
db.beginTransaction();
//建立交易
boolean
success =
false
;
//判斷參數
//由之前不用的版本,可做不同的動作
switch
(oldVersion) {
case
1
:
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);
}
}
沒有留言:
張貼留言