2011-08-29 111 views
1

我希望每次更新應用程序時清除我的應用的sqlite數據庫。 爲此,我在SQLiteDatabase的「onUpgrade」函數中對我的所有表進行了drop table查詢。Android數據庫版本號

我有兩個問題: - 在我的應用程序首次發佈時,我沒有做任何特殊的事情。 - 在第二次啓動時,我添加了一個「setVersion(2)」行。它調用onUpgrade方法,但日誌很奇怪:

public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    Log.d("GDB", "onUpgrade "+oldVersion+" -> "+newVersion); 
} 
---------------------------------------------------------- 
DEBUG/GDB(5928): onUpgrade 2 -> 1 

所以,當我做一個setVersion(),2個版本似乎切換.....

我的第二個問題是,是我第三次啓動我的應用程序,而不更改代碼(所以setVersion(2)已經在這裏),onUpgrade方法再次被調用!我是否錯過了將版本確定爲2的內容?

+0

查看定義數據庫版本號的代碼會很有幫助。你會發布你的數據庫適配器的相關部分嗎? – Shlublu

+0

只是一個setVersion(2),正如我所說的 – Imotep

+0

這是看到更多的適配器將會有用的地方。我認爲你做錯了,通過覆蓋最初的數據庫版本而不是現在的版本:似乎SQLite認爲最初創建的版本是2,事實並非如此。 – Shlublu

回答

3

我不認爲你應該直接使用setVersion方法在代碼中設置數據庫的版本。相反,您應該將模式版本傳遞給SQLiteOpenHelper的構造函數(或者至少可以擴展您的類)。然後,onUpgrade方法應包含條件語句以決定要運行哪些版本,具體取決於用戶從哪個版本進行升級。這些條件應該形成級聯,以便來自低版本的所有數據庫更新都按順序應用,以使用戶達到當前級別。 所以,當你想改變你的模式時,你需要給onUpgrade添加一個新的條件,然後向你的構造函數傳遞模式版本。

這是在OpenHelper構造的樣子:

public TiftHelper(Context context) { 
    super(context, DATABASE_NAME, null, SCHEMA_VERSION); 
} 

然後onUpgrade看起來是這樣的:

@Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.d(TAG, "on upgrade called. Old version:" + oldVersion 
       + ". New version:" + newVersion); 

     if (oldVersion == 19) { 
      db.execSQL("create table challenges_temp as select * from challenges;"); 
      db.execSQL("drop table challenges;"); 
      db.execSQL(create_challenges); 
      db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp"); 
      db.execSQL("drop table challenges_temp;"); 
     } 
     if (oldVersion <= 20) { 
      // adding the status column to the challenges table 
      db.execSQL("create table challenges_temp as select * from challenges;"); 
      db.execSQL("drop table challenges;"); 
      db.execSQL(create_challenges); 
      db.execSQL("insert into challenges (_id, name, is_predef, status) select _id, name, is_predef, 'IN_PROGRESS' from challenges_temp"); 
      db.execSQL("drop table challenges_temp;"); 
     } 

這對我來說工作正常。

+0

謝謝,它通過設置SCHEMA_VERSION而不是setVersion();) – Imotep