2012-10-31 39 views
6

我創建了一個Android應用程序,它在啓動時檢查是否有新版本的應用程序。如果是的話,該應用程序下載新的apk文件並過度安裝新的apk。 我的應用程序使用sqlite數據庫。但是從一個版本到另一個版本的這個db可以改變。 我想我必須使用方法:onUpgrade()Android中的sqlite數據庫

onUpgrade() 

,但我不知道究竟如何使用它。

當我開始我使用克里特數據庫代碼(如果不存在)的應用程序:

DbHelper mDHelper = new DbHelper(context, DB_NAME, null, DB_VERSION) 

我應該改變,如果我想用onUpgrade()方法? 我什麼時候需要打電話?

+1

版本號 – njzk2

回答

17

onUpgrade()被稱爲(你不把它自己)當你的數據庫的版本改變,這意味着基本表結構的改變等

一般來說這意味着操作系統是告訴你「哎,你自找的數據庫結構版本10,但是我發現我們在這裏得到了更老的東西,所以這是在開始使用數據庫之前修復這個問題的機會(並且可能因結構不匹配而崩潰)「

在這種方法中,你應該做所有必要的,以及..升級你的舊數據庫的結構來構造匹配的當前版本需求,比如添加/刪除列,轉換行內容或者甚至完全刪除舊的數據庫,從頭開始 - 對於Android來說,無論你在這裏做什麼都沒有關係 - 它只是爲你的代碼做一些必要的工作(如果有的話)的一種緊急回調。您需要注意,用戶可能不會頻繁更新,因此您必須始終處理從版本X升級到Y的知識,因爲X可能不等於(Y-1)。

+1

我注意到onUpgrade帶兩個int參數:oldVersion和newVersion。因此,如果我在我的應用程序中,版本1的數據庫和下載的apk包含版本2的數據庫,這允許系統自動調用onUpgrade()方法? – GVillani82

+0

像http://code.google.com/p/openintents/source/browse/trunk/notepad/NotePad/src/org/openintents/notepad/NotePadProvider.java?r=3878 中的建議我可以使用開關( oldVersion)考慮到每個舊版本的不同更改?這是對的嗎? 此外,如果在一個新的數據庫版本中,我將新列添加到某個表中,我還必須修改onCreate,以創建具有新增列的表?這可能是有意義的,如果沒有應用程序尚未安裝和新的數據庫必須創建。我的假設是否正確? – GVillani82

+2

是的。版本號只是'int',所以你可以定期做'switch/case'。但重要的是,你應該例如處理從版本2升級到版本3,但也從1升級到3(我可能只是在那裏循環,首先從1升級到2,然後從2升級到3),這可能會比處理從1到3的直接更新更簡單(或從1到80更寬的視角) –

4

如果您正在使用SQLiteOpenHelper,則每次更改數據庫版本時都會調用onUpgrade。 對此有一個額外的要求。數據庫名稱必須保持不變。

Old Version: 
dbName = "mydb.db" 
dbVersion = 1 

New Version: 
dbName = "mydb.db" 
dbVersion = 2 
在內容提供商的OnCreate

您創建的需要,這些PARAMS的SQLiteOpenHelper的一個實例。你SQLiteOpenHelper實施應該是這樣的:

public static final class MySQLiteOpenHelper extends SQLiteOpenHelper { 

     public MySQLiteOpenHelper(Context context, int dbVersion, String dbName) { 
      super(context, dbName, null, dbVersion); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      //Code to create your db here 
     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      // Code to upgrade your db here 
     } 

} 

它會當你改變你的表或數據庫中添加更多的製表

0

我發現這非常有幫助 https://thebhwgroup.com/blog/how-android-sqlite-onupgrade

@Override 
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
    if (oldVersion < 2) { 
     db.execSQL(DATABASE_ALTER_TEAM_1); 
    } 
    if (oldVersion < 3) { 
     db.execSQL(DATABASE_ALTER_TEAM_2); 
    } 
} 
可以稱爲