【发布时间】:2012-04-21 21:18:25
【问题描述】:
我正在开发一个应用程序并使用 SQLite、contentResolver 和 contentProvider。
应用说明 我的应用程序在内部 SQLite DB 中搜索联系人。数据来自第一次午餐或用户按下菜单中的更新选项时选择的外部文件。
对数据库的所有访问都是使用 getContentResolver() 完成的。
内容提供者 我有一个 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() 期间手动检查版本是否更高(但这会很昂贵,因为每次调用都会完成),如果答案为真,则手动调用 onUpgrade。
或尝试以某种方式取消注册提供程序,但到目前为止没有找到任何有效且良好的解决方案。
升级数据库的最佳做法是什么?
谢谢!
【问题讨论】:
标签: android sqlite android-contentprovider android-contentresolver sqliteopenhelper