2012-02-02 142 views
1

我有一個升級我的sqlite數據庫的小問題。現在我使用的是這樣的:Android升級sqlite數據庫問題

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w("","UPGRADE DATABASE : "+" oldVErsion : "+oldVersion+" newVersion : "+newVersion); 
    switch(newVersion){ 
    case 2: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
    case 3: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)"); 
    } 
} 

它的工作,如果你已經擁有了從beggining..but安裝的應用程序,如果你現在安裝它,它只會在case 3運行查詢,因爲目前的版本是3

我需要找到一種方法來從頭開始運行查詢..如果我的最後一個版本的數據庫是5,我想首先運行情況2,而不是情況3,而不是最後一種情況5。因此,我不需要從頭開始編寫所有查詢,因爲它會爲舊用戶崩潰。

任何想法如何實現這一目標?

回答

2

只需將案例2中的查詢添加到案例3中,並在每個案例之後添加break語句。所以你的情況就會是這樣的:

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    Log.w("","UPGRADE DATABASE : "+" oldVErsion : "+oldVersion+" newVersion : "+newVersion); 
    switch(newVersion){ 
    case 2: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
     break; 
    case 3: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
     db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)"); 
     break; 
    } 
} 

更新:待辦事項smthg這樣的:

switch(newVersion){ 
case 2: 
    Log.w("","UPGRADE DATABASE : "+newVersion); 
    db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
    db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
    break; 
case 3: 
    Log.w("","UPGRADE DATABASE : "+newVersion); 
    switch(oldVersion) { 
     case 1: 
      db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
      db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
      db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)"); 
      db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)"); 
      db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)"); 
      break; 
     case 2: 
      db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)"); 
      db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)"); 
      db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)"); 
      break; 
    } 

} 
+0

我已經嘗試過this..but有另一個問題。如果是全新安裝,新用戶將直接進入版本3,這是正確的..但是如果用戶已經擁有第二版數據庫,並且當他嘗試升級到版本3時,它會拋出異常,因爲他已經擁有了'bonus_text'和'quantitiy'列。 – 2012-02-02 09:44:56

+0

我已添加更新。 – Yury 2012-02-02 09:51:18

+0

感謝您的更新answer.it工程! – 2012-02-02 10:15:36

2

怎麼樣使用循環?

 //or start = oldVersion;    
for (int start = 2 , start<=newVersion ; start++){ 
     switch(start){ 
    case 2: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN bonus_text VARCHAR(200)"); 
     db.execSQL("ALTER TABLE collection_lang ADD COLUMN quantity integer"); 
     break; 
    case 3: 
     Log.w("","UPGRADE DATABASE : "+newVersion); 
     db.execSQL("ALTER TABLE users ADD COLUMN firstName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN lastName varchar(70)"); 
     db.execSQL("ALTER TABLE users ADD COLUMN user varchar(70)"); 
     break; 
    default: 
     break; 
    } 

但它不是正常的方式。就好像用戶已經添加了一些修改。而且你再次運行這個改動,那麼它會產生異常。

+0

如果您有oldVersion = 3和newVersion = 4,它將無法正常工作。要在一般情況下在週期的頭部工作,您應該:int start = oldVersion。 – Yury 2012-02-02 10:47:02

+0

我認爲你的方法很難理解,但它比我更漂亮。 – Yury 2012-02-02 10:49:42

+0

是的,你是對的。感謝您的建議。 – Arslan 2012-02-02 10:54:08

1

而不是嵌套一堆開關,它會變得非常難看。我會建議這種方法將涵蓋所有情況。這將更新現有的數據庫(不管版本),以目前在逐步的方式:(爲討論here

int curVer = oldVersion; 
while (curVer < newVersion) { 
    curVer++; 
    switch (curVer) { 
     case 2: { 
      // Upgrade from V1 to V2 
      break; 
     } 
     case 3: { 
      // Upgrade from V2 to V3 
      break; 
     } 
     case 4: { 
      // Upgrade from V3 to V4 
      break; 
     } 
    } 
} 
0

簡單,,只需按相反的順序您的案件情況和不使用破

例如在以下條件下,如果我值爲3,將打印3,2,1如果4然後4,3,2,1

switch(i){ case 4: System.out.println("4"); case 3: System.out.println("3"); case 2: System.out.println("2"); case 1: System.out.println("1"); }