2011-05-27 83 views
1

我想通過向我的android應用程序的Sqlite表中添加一列來升級某個表。我在DBHelper的onUpgrade方法中添加了一個alter table語句。Android onUpgrade每次都會被調用

以下是我看到的問題 我將數據庫版本的值從1更改爲2,所以最好現在onUpgrade應該被調用。它確實被調用,但每次實例化類時都會調用它。結果我得到一個列已經存在錯誤。

這裏是onUpgrade方法

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, 
    int newVersion) 
    { 
     Log.d("old Version",oldVersion+""); 
     Log.d("New Version",newVersion+""); 
     db.beginTransaction(); 

     try 
     {   
      String DATABASE_UPGRADE; 
      DATABASE_UPGRADE="alter table "+DATABASE_TABLE_MESSAGES+" ADD COLUMN "+ IS_READ+ " integer DEFAULT 0;"; 
      db.execSQL(DATABASE_UPGRADE); 
      Log.d("upgrade", "Successful"); 
      db.setTransactionSuccessful(); 
     } 


    finally 
    { 
     db.endTransaction(); 
    } 

    } 
}  

我很奇怪,爲什麼onUpgrade被每次叫!

+0

我不知道,但我願意打賭,版本沒有正確更新數據庫(我不明白爲什麼)。要檢查數據庫的版本,可以使用'db.getVersion()'。 – dmon 2011-05-27 14:46:53

+0

onUpgrade方法中有2條log.d語句,它們分別顯示1和2的值。因此數據庫版本爲1.我可能需要刪除數據庫並重試... – Rupin 2011-05-27 14:57:45

回答

1

在數據庫幫助器的構造函數中,您是否正確地傳遞了新的版本號?

編輯:應該是這樣的

DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

DATABASE_VERSION應該爲2

+0

感謝Femi回覆。DATABASE_VERSION是一個公共變量,它在DDMS透視圖的onUpgrade show 1和2中的log.d語句處被初始化... – Rupin 2011-05-27 14:54:38

+0

因此,升級可能會失敗。在'finally'之前放一個'catch'語句,看看會發生什麼:你可能需要在'alter table'語句末尾刪除分號,並且可能引用'IS_READ'值。 – Femi 2011-05-27 14:57:59

+0

費米是正確的,你的升級可能會失敗,這就是爲什麼你的版本停留在1.添加一個catch並記錄任何異常。 – dmon 2011-05-27 15:16:33

相關問題