1

我正在開發一個應用程序並使用SQLite,contentResolver和contentProvider。使用ContentProvider升級Android中的SQLite數據庫

應用程序描述 我的應用程序搜索內部SQLite數據庫中的聯繫人。數據從第一次午餐時選擇的外部文件或當用戶按下菜單中的更新選項時到達。

使用getContentResolver()完成對數據庫的所有訪問。

的ContentProvider 我有一個ContactsContentProvider類,它擴展的ContentProvider並持有至ContactsDBAdapter這是一個擴展SQLiteOpenHelper我的數據庫適配器的參考。 (我希望你到現在都和我在一起)。

問題描述 當用戶按下更新按鈕我希望DB刪除所有表和加載新的數據(這是由我的文件選擇做偉大工程)。在我ContactsDBAdapter爲了使onUpgrade()工作內容提供商的onCreate() 必須具有更高的版本被稱爲又算得了什麼呢

@Override 
public boolean onCreate() { 
     context = getContext(); 
     pref = PreferenceManager.getDefaultSharedPreferences(context); 
     int dbVersion = pref.getInt(Settings.DB_VERSION, 1); 
     mDb = new ContactsDBAdapter(context,dbVersion); 
     return (mDb == null)? false : true; 
} 

有過,但我得到了ContentProvider的從我的contentResolver所以它不會創建兩次。

雖然有很多的如何使用這兩種的ContentProviderContentResolver的我沒有找到任何地方一個很好的升級進步的解釋。

我知道的onUpgrade是如何工作的,它被在getReadableDatabase()getWritableDatabase()調用檢查,但事實是,版本將不會被diferent因爲ContactsDBAdapter是與之前相同的實例。

我想到了一些解決方法,但根本不喜歡它們。 我可以在insert()期間手動檢查版本是否更高(但由於每次調用都會完成,這會很昂貴),並且如果答案爲真,則手動調用onUpgrade。

或嘗試以某種方式取消註冊提供程序,但目前爲止尚未找到任何有效且良好的解決方案。

升級數據庫的最佳做法是什麼?

謝謝!

回答

0

我找到了一個很好的解決方案。 在我ContactsContentProvider延伸的ContentProvider我加了一個sharedPrefencesListener

@Override 
public boolean onCreate() { 
     context = getContext(); 
     pref = PreferenceManager.getDefaultSharedPreferences(context); 
     int dbVersion = pref.getInt(Settings.DB_VERSION, 1); 
     mDb = new ContactsDBAdapter(context,dbVersion); 
     pref.registerOnSharedPreferenceChangeListener(sharedPrefListener) ; 
     return (mDb == null)? false : true; 
} 
SharedPreferences.OnSharedPreferenceChangeListener sharedPrefListener = 
    new SharedPreferences.OnSharedPreferenceChangeListener() { 

    @Override 
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, 
    String key) { 
    if(key.equals(Settings.DB_VERSION)){ 
    int dbVersion = sharedPreferences.getInt(Settings.DB_VERSION, 1); 
    synchronized (mDb) { 
      mDb.close();//Not sure this is the right behavior 
     mDb = new ContactsDBAdapter(context,dbVersion); 
    } 
    } 
} 
}; 

現在,當用戶在我的主要活動改變了版本號,然後我設置了版本號。這將調用一個新的ContactsDBAdapter,然後在下次有人需要getReadableDatabase()或getWriteableDatabase()時調用onUpgrade。

1

我建議您更新共享偏好改變數據庫的版本,並將其添加:

SharedPreferences.Editor ed = pref.edit(); 
ed.putInt(Settings.DB_VERSION, dbVersion + 1); 
ed.commit(); 

希望它可以幫助你

+0

這當用戶如你CAC看到這裏點擊更新按鈕完成: \t公共無效的onClick(DialogInterface對話,詮釋其){// \t \t \t \t \t \t \t dialog.dismiss(); \t \t \t \t \t \t \t int newVersion = preferences.getInt(Settings.DB_VERSION,1)+ 1; \t \t \t \t \t \t \t Editor editor = preferences.edit(); \t \t \t \t \t \t \t editor.putInt(Settings.DB_VERSION,newVersion); (「更新」,「更新數據庫版本爲版本:」+ newVersion);以及更新版本。 \t \t \t \t \t \t \t editor.commit(); \t \t \t \t \t \t \t \t \t \t \t \t \t lunchFileChooser(); \t \t \t \t \t \t} – Ika 2012-04-21 22:06:14

+0

嗨文斯。我不確定我的回覆是否被正確理解。你的建議是當我想更新數據庫時更新版本(下一次調用getReadableDatabase),但這會**不會發生(因爲它正是我所做的),這是由於onCreate每次調用都不會調用contentResolver,因此不會更新數據庫版本。 – Ika 2012-04-22 16:44:20