2011-12-24 137 views
7

我有一個數據庫,我想添加一列,我改變了靜態數據庫版本,但是當我在我的設備上運行該程序的新列仍然不存在,所以我猜我的onUpdate沒有被調用,我是不知道爲什麼。更新sqlite數據庫版本?

這是我怎麼回事創建數據庫

 private static class DatabaseHelper extends SQLiteOpenHelper 
    { 
     DatabaseHelper(Context context) 
     { 
      super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) 
     { 
      createTables(db); 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, 
           int newVersion) 
     { 
      Log.w("CalendarDB", "Upgrading database from version " + oldVersion 
        + " to " 
        + newVersion + ", which will destroy all old data"); 
      db.execSQL("DROP TABLE IF EXISTS Events_Table"); 
      onCreate(db); 
     } 

     private void createTables(SQLiteDatabase db){ 
      db.execSQL("CREATE TABLE " + EVENTS_TABLE + "(" + ID + " integer primary key autoincrement, " + 
        EVENT + " TEXT, " + LOCATION + " TEXT, " + DESCRIPTION + " TEXT, " + DATE + " TEXT, " + START + " LONG, " + END + " TEXT, " + REAL_START_TIME + " TEXT," 
        + REAL_END_TIME + " TEXT," + COLOR + " TEXT, " + BLINK + " TEXT, " + VIBRATE + " TEXT, " + RING_TONE_PATH + " TEXT, " + ICON + " TEXT, " + REMINDERS + 
        " TEXT, " + START_WITH_REMINDER + " TEXT, " + CALENDAR_ID + " TEXT, " + EVENT_ID + " TEXT);"); 
     } 
    } 

是有什麼我必須做的就是onUpdate得到叫什麼?我嘗試以下this answer,但還是沒有結果

回答

11

爲了升級Android中,你應該通過一個遞增DATABASE_VERSION數據庫,爲了讓SQLOpenHelper知道它必須調用onUpgrade方法。

Rembember

這隻有當你調用getWritableDatabase(工作),否則將無法升級。如果您更改版本並致電getReadableDatabase,它將顯示異常

throw new SQLiteException("Can't upgrade read-only database from version " + 
         db.getVersion() + " to " + mNewVersion + ": " + path); 

但是爲什麼? 你看,當你調用getWritableDatabase代碼請檢查是否版本是一樣的:

if (version != mNewVersion) { 
       db.beginTransaction(); 
       try { 
        if (version == 0) { 
         onCreate(db); 
        } else { 
         if (version > mNewVersion) { 
          onDowngrade(db, version, mNewVersion); 
         } else { 
          onUpgrade(db, version, mNewVersion); 
         } 
        } 
        db.setVersion(mNewVersion); 
        db.setTransactionSuccessful(); 
       } finally { 
        db.endTransaction(); 
} 
} 

更新

那麼事實證明,它應與getReadableDatabase(),因爲在代碼中你總是越來越上班一個可寫的數據庫。因此,它應與工作方法,這裏是getReadableDatabase()的文檔:

創建和/或打開數據庫。這將是getWritableDatabase()返回的 相同的對象,除非某些問題(如完整磁盤, 要求數據庫以只讀方式打開)。在這種情況下,將返回一個 只讀數據庫對象。如果問題得到解決,將來可能會調用getWritableDatabase(),在這種情況下,將關閉只讀數據庫對象,並將在未來返回讀/寫對象 。

+0

那麼我在哪裏調用getWritableDatabase呢?我應該在我的構造函數中調用它嗎? – tyczj 2011-12-24 23:17:22

+0

無論你在哪裏使用它...我通常在我的ContentProvider中使用它,但如果你沒有它,它應該在你的代碼中流利地運行,任何你要插入或更新getWritableDatabase的地方必須是所謂的,它不是迫使它的使用。 – Necronet 2011-12-24 23:51:29

+0

@tyczj〜「那麼我應該在哪裏調用getWritableDatabase呢?」我假設你正在使用SQLiteOpenHelper類來執行CRUD操作?在這種情況下,當您在代碼中獲取SQLiteOpenHelper的實例時,您將調用getWritableDatabase()。 – 2013-12-13 16:09:10

1

我建議你增加一個DATABASE_VERSION,這將導致應用程序調用onUpgrade()

+0

我說,我這樣做,並且它沒有做任何事情 編輯*我改變了'私有靜態最終詮釋DATABASE_VERSION = 2'從'1'到'2' – tyczj 2011-12-24 22:29:43

+0

有沒有在logcat的任何異常? – prometheuspk 2011-12-24 22:40:03