2016-09-16 30 views
0

我試圖更新表的模式在onUpgrade()方法的過程中我的SQLite數據庫。我正在通過刪除表格然後用新模式重新創建表格來做到這一點。有時舊模式在這兩個操作運行後仍然存在,所以我需要一種方法來在創建新表之前強制刪除舊錶。有誰知道如何做到這一點?下面是代碼:如何強制SQLite數據庫的操作是同步的

 database.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 
     database.execSQL(buildAlarmTable()); 

舊模式:

private String buildAlarmTable() { 
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS + 
      "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY NOT NULL," + 
      KEY_ALARM_NAME + " TEXT," + 
      KEY_ALARM_TIME + " INTEGER" + 
      ")"; 
} 

新的模式:

public String buildAlarmTable() { 
    return "CREATE TABLE IF NOT EXISTS " + TABLE_ALARMS + 
      "(" + KEY_ALARM_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
      KEY_ALARM_NAME + " TEXT," + 
      KEY_ALARM_TIME + " INTEGER," + 
      KEY_ALARM_MALID + " INTEGER" + 
      ")"; 
} 

我知道舊模式仍然存在,因爲我得到一個異常的 「KEY_ALARM_MALID」 列在稍後從數據庫讀取時不存在。

+1

通常情況下,您只需更新您的SqliteOpenHelper類 –

+1

數據庫版本號我不知道你問的同步行動,雖然。查詢SQLite數據庫的IO操作相當同步 –

+0

爲了澄清,有時新創建的TABLE_ALARMS表將包含舊架構,該架構沒有新列。其他時候它會正確地擁有新的模式。這導致我認爲這些操作沒有同步發生 –

回答

0

刪除該表並重新創建它onUpgrade()是不更新表的架構的理想方式。另外,你將失去所有的數據行!使用ALTER TABLE這樣,假設老版本是1,新版本爲2

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     db.execSQL("ALTER TABLE " + TABLE_ALARMS + " ADD COLUMN " + KEY_ALARM_MALID + " int default 0;"); 
    } 
} 

和當然,保持buildAlarmTable()新版本的新數據庫。

但是如果你必須刪除表,試試這個:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    db.execSQL("DROP TABLE IF EXISTS " + TABLE_ALARMS); 
    onCreate(db); 
}