2011-04-29 104 views
3

我寫了一些代碼來確保我的數據庫在我將應用程序發佈更新時能夠正確更新。更新數據庫不起作用-Android

問題是SQLiteOpenHelper的OnUpdate()函數永遠不會被調用。 這裏是我的主要活動寫的代碼 -

SharedPreferences DB_ver = getSharedPreferences(PREFS_NAME, 0); 
    myDbHelper = new DataBaseHelper(con, DB_ver.getInt("DB_ver", 1)); 
    try { 
     if(DB_ver.getInt("DB_ver", 1) !=getPackageManager().getPackageInfo(getPackageName(), 0).versionCode) 
     { 
       SharedPreferences.Editor editor = DB_ver.edit(); 
       editor.putInt("DB_ver", getPackageManager().getPackageInfo(getPackageName(), 0).versionCode); 
     } 
    } catch (NameNotFoundException e) { 
     e.printStackTrace(); 
    } 

這裏是SQLiteOpenHelper的構造函數(它擴展了SQLiteOpenHelper) -

public DataBaseHelper(Context context,int ver_code) {  
    super(context, DB_NAME, null, ver_code); 
    this.myContext = context; 
} 

現在我理解的是,超級線應該調用onUpgrade()函數會自動執行,但它不會。

我已經單獨測試了onUpgrade()函數,它的工作原理。

有誰知道有什麼問題?

謝謝!

+0

我不明白爲什麼你想在SharedPreferences手動存儲的版本,這是不必要。每當你發佈一個新版本的應用程序,將ver_code增加到2(在你的代碼中),升級方法將被自動調用。 – dmon 2011-04-29 15:08:22

回答

1

你的行爲真的不是必要的。 SQLiteOpenHelper完成你需要的一切。這是一種可能的情況。 SQLiteOpenHelper在情況下,getVersion()方法中,需要查詢其在一個點(我從來沒有):

public class MySQLiteOpenHelper extends SQLiteOpenHelper { 

    private static final String dbname = "whatever"; 
    private static final int dbversion = 1; // your first version 
//private static final int dbversion = 2; // your second version 
//private static final int dbversion = 3; // your third version 

    public MySQLiteOpenHelper(Context context) { 
    super(context, dbname, null, dbversion); 
    this.context = context; 
    } 

    @Override 
    public void onCreate(SQLiteDatabase sqliteDatabase) { 
    // ... Create first database content 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase sqliteDatabase, int oldVersion, int newVersion) { 
    switch (newVersion) { 
     case dbversion: // suppose your on third version 
     if (oldVersion == 1) { 
      upgradeFrom1To2(sqliteDatabase); 
      upgradeFrom2To3(sqliteDatabase); 
     } 

     if (oldVersion == 2) { 
      upgradeFrom2To3(sqliteDatabase); 
     } 

     break; 
     default: 
     break; 
    } 
    } 

    public void upgradeFrom1To2(SQLiteDatabase sqliteDatabase) { 
    // ... 
    } 

    public void upgradeFrom2To3(SQLiteDatabase sqliteDatabase) { 
    // ... 
    } 
} 
+0

這正是我所說的,但帶有代碼。 – 2011-04-29 20:10:02

0

我看到的一件事是,您沒有將您的更改提交給您打開的SharedPreferences。你需要調用editor.commit();保存對SharedPreferences的更改。

另外,你有沒有試過在讀或寫模式下打開數據庫?

1

兩件事情:

  1. 你不是叫editor.commit()
  2. 您正在創建數據庫,該代碼中初始版本值爲1。除非您在AndroidManifest.xml中更改版本號,否則它永遠不會是任何內容。直到版本更改onUpgrade()不需要調用。數據庫首次創建時會調用onCreate(),但只有在報告的版本不同時調用onUpgrade()
1

您應該更改整數「VERSION」以獲取您的onUpgrade調用。

此外,onUpgrade接收兩個整數,第一個是數據庫的當前版本(從中升級),第二個是要升級到的版本。