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

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

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

内容提供商
我有一个ContactsContentProvider类,该类扩展了ContentProvider并保存了对ContactsDBAdapter的引用,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();


希望它对您有帮助

关于android - 使用ContentProvider在Android中升级SQLite DB,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10263099/

10-11 14:07