我在我的应用程序中使用ContentProvider,除了一个小问题外,一切都很好。我有一个备份和恢复功能,可以将数据库备份到SD卡上的文件,然后可以恢复这些备份文件以覆盖当前数据库。整个过程正在运行,但一旦旧的备份文件恢复,ContentProvider仍然保留原始数据库的引用/缓存。我似乎无法找到一种方法来刷新或重新加载ContentProvider中的数据库引用。我知道恢复是有效的,因为我可以使用SQLite编辑器查看数据库中的记录,当我关闭并重新打开应用程序时,它会显示正确的记录。
有人知道这样做的方法吗?有没有办法关闭并重新打开我没有看到的ContentProvider?
答案 0 :(得分:28)
如果您定位> = API 5,则可以通过ContentProvider
获取对ContentProviderClient
的引用,并运行特定于您的实施的方法:
ContentResolver resolver = context.getContentResolver();
ContentProviderClient client = resolver.acquireContentProviderClient("myAuthority");
MyContentProvider provider = (MyContentProvider) client.getLocalContentProvider();
provider.resetDatabase();
client.release();
将重置方法添加到ContentProvider
实施中:
public void resetDatabase() {
mDatabaseHelper.close();
mDatabaseHelper = new MyDatabaseOpenHelper(context);
}
答案 1 :(得分:6)
您是否在内容提供商中保留对实际SQLiteDatabase
的引用(例如在SQLiteOpenHelper.getWritableDatabase()
中调用onCreate()
然后保留该引用)?或者您是否从每个提供程序方法中的帮助程序中获取数据库对象?
通常,如果您只保留对助手的本地引用,并根据需要在每个方法中获取可写/可读数据库实例,那么此问题应该消失。如果没有,或许我们可以看看提供商代码?
希望有帮助!
答案 2 :(得分:1)
这是我的解决方案。
public class DataProvider extends ContentProvider {
private DataDbHelper dbHelper;
@Override
public boolean onCreate() {
// nothing here
return true;
}
private DataDbHelper getDbHelper() {
if (dbHelper== null) {
// initialize
dbHelper = new DataDbHelper(getContext());
} else if (dbHelper.getReadableDatabase().getVersion() != DataDbHelper.VERSION) {
// reset
dbHelper.close();
dbHelper = new DataDbHelper(getContext());
}
return this.mOpenHelper;
}
}
query(), insert(), update(), delete()
使用getDbHelper()
获取SQLiteDatabase
如果您需要更多信息,我的Android应用的完整代码可用here。
答案 3 :(得分:0)
您也可以简单地使用删除方法而无需选择:
context.getContentResolver().delete(YourProvider.CONTENT_URI, null, null);