使用ContentProvider升级Android中的SQLite DB

使用ContentProvider升级Android中的SQLite DB,android,sqlite,android-contentprovider,android-contentresolver,sqliteopenhelper,Android,Sqlite,Android Contentprovider,Android Contentresolver,Sqliteopenhelper,我正在开发一个应用程序,并使用SQLite、contentResolver和contentProvider 应用程序说明 我的应用程序在内部SQLite数据库中搜索联系人。数据来自在第一次午餐时或用户按下菜单中的更新选项时选择的外部文件 使用getContentResolver()完成对数据库的所有访问 内容提供者 我有一个ContactsContentProvider类,它扩展ContentProvider,并保存对ContactsDBAdapter的引用,ContactsDBAdapter是

我正在开发一个应用程序,并使用SQLite、contentResolver和contentProvider

应用程序说明 我的应用程序在内部SQLite数据库中搜索联系人。数据来自在第一次午餐时或用户按下菜单中的更新选项时选择的外部文件

使用getContentResolver()完成对数据库的所有访问

内容提供者 我有一个ContactsContentProvider类,它扩展ContentProvider,并保存对ContactsDBAdapter的引用,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;
}
但是我从我的contentResolver获取contentProvider,所以它不会被创建两次

虽然有很多关于如何同时使用contentProvider和contentResolver的解释,但我没有发现有什么好的升级进展

我知道onUpgrade是如何工作的,并且在getReadableDatabase()和getWritableDatabase()调用期间会对其进行检查,但事实是版本不会有所不同,因为ContactsDBAdapter与以前是同一个实例

我考虑过一些变通办法,但一点也不喜欢。 我可以在insert()期间手动检查版本是否更高(但这会很昂贵,因为每次调用都会执行),如果答案为真,则手动调用onUpgrade

或者尝试以某种方式注销提供商,但迄今为止没有找到任何有效的解决方案

升级数据库的最佳做法是什么?


谢谢

我建议您更新共享首选项以更改db版本并添加它:

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

希望它能帮助您

我建议您更新共享首选项以更改db版本并添加它:

SharedPreferences.Editor ed = pref.edit();
ed.putInt(Settings.DB_VERSION, dbVersion + 1);
ed.commit();
希望它能帮助您

我找到了一个很好的解决方案。 在扩展ContentProvider的ContactsContentProvider中,我添加了一个SharedReferencesListener

现在,当用户在我的主要活动中更改版本号时,我将设置版本号。这将调用一个新的ContactsDBAdapter,下次有人需要getReadableDatabase()或getWriteableDatabase()时,它将调用onUpgrade。

我找到了一个很好的解决方案。 在扩展ContentProvider的ContactsContentProvider中,我添加了一个SharedReferencesListener


现在,当用户在我的主要活动中更改版本号时,我将设置版本号。这将调用一个新的ContactsDBAdapter,当下次有人需要getReadableDatabase()或getWriteableDatabase()时,它将调用onUpgrade。

这是在用户单击更新按钮时完成的,如您所见:public void onClick(DialogInterface dialog,int which){//dialog.disease();int newVersion=preferences.getInt(Settings.DB_VERSION,1)+1;Editor-Editor=preferences.edit();Editor.putin(Settings.DB_VERSION,newVersion);Log.i(“更新”,“更新DB版本至版本:”);Editor.commit();午餐文件选择器();}Hi Vince。我不确定我的回答是否被正确理解。您的建议是在我希望更新数据库时更新版本(下次调用getReadableDatabase时),但这不会发生(因为这正是我正在做的)这是因为每次调用都不会调用onCreate的contentResolver,因此不会更新DB版本。这是在用户单击更新按钮时完成的,如您所见:public void onClick(DialogInterface dialog,int which){//dialog.disease();int newVersion=preferences.getInt(Settings.DB_VERSION,1)+1;Editor Editor=preferences.edit();Editor.putin(Settings.DB_VERSION,newVersion);Log.i(“更新”,“将DB VERSION更新为版本:“+newVersion”);Editor.commit();午餐文件选择器();}嗨,文斯。我不确定我的回答是否被正确理解。你的建议是在我希望数据库更新时(下次调用getReadableDatabase时)更新版本,但这不会发生(因为这正是我正在做的)这是因为每次调用都不会调用onCreate的contentResolver,因此不会更新DB版本。