还原后,在自定义ContentProvider中刷新/重新加载数据库引用

时间:2011-11-22 23:01:02

标签: android database eclipse

我在我的应用程序中使用ContentProvider,除了一个小问题外,一切都很好。我有一个备份和恢复功能,可以将数据库备份到SD卡上的文件,然后可以恢复这些备份文件以覆盖当前数据库。整个过程正在运行,但一旦旧的备份文件恢复,ContentProvider仍然保留原始数据库的引用/缓存。我似乎无法找到一种方法来刷新或重新加载ContentProvider中的数据库引用。我知道恢复是有效的,因为我可以使用SQLite编辑器查看数据库中的记录,当我关闭并重新打开应用程序时,它会显示正确的记录。

有人知道这样做的方法吗?有没有办法关闭并重新打开我没有看到的ContentProvider?

4 个答案:

答案 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);