![](/img/trans.png)
[英]Setting the _ID field using SQLite & ContentProvider in Android
[英]upgrading SQLite DB in Android using ContentProvider
我正在開發一個應用程序,並使用SQLite,contentResolver和contentProvider。
應用程序描述我的應用程序在內部SQLite DB中搜索聯系人。 數據來自在第一頓午餐或用戶按菜單中的更新選項時選擇的外部文件。
使用getContentResolver()完成對數據庫的所有訪問。
ContentProvider我有一個ContactsContentProvider類,該類擴展了ContentProvider並持有對ContactsDBAdapter的引用,這是我的數據庫適配器,它擴展了SQLiteOpenHelper 。 (我希望直到現在都和我在一起)。
問題描述當用戶按下更新按鈕時,我希望數據庫刪除所有表並加載新數據(這是由我的文件選擇器完成的,效果很好)。 為了使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;
}
但是我從contentResolver獲取contentProvider ,因此不會創建兩次。
盡管有很多關於如何同時使用contentProvider和contentResolver的說明,但我在任何地方都找不到很好的升級進度。
我知道onUpgrade的工作方式,並在getReadableDatabase()和getWritableDatabase()調用期間對其進行了檢查,但事實是該版本不會有所不同,因為ContactsDBAdapter與以前的實例相同。
我想到了一些解決方法,但根本不喜歡它們。 我可以在insert()期間手動檢查版本是否更高(但這會很昂貴,因為每次調用都會完成),如果答案為true,則手動調用onUpgrade。
或嘗試以某種方式注銷提供者,但到目前為止仍未找到任何有效且好的解決方案。
升級數據庫的最佳實踐是什么?
謝謝!
我建議您更新共享首選項以更改數據庫版本並添加它:
SharedPreferences.Editor ed = pref.edit();
ed.putInt(Settings.DB_VERSION, dbVersion + 1);
ed.commit();
希望它對您有幫助
我找到了一個不錯的解決方案。 在擴展ContentProvider的 ContactsContentProvider中 ,我添加了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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.