Refresh/Reload database reference in custom ContentProvider after restore

前端 未结 4 1442
失恋的感觉
失恋的感觉 2020-12-16 21:57

I use a ContentProvider in my app and everything works great except for one little issue. I have a backup and restore function that backs up the database to a file on the SD

相关标签:
4条回答
  • 2020-12-16 22:36

    If you are targeting >= API 5 you can get a reference to your ContentProvider via a ContentProviderClient, and run a method specific to your implementation:

    ContentResolver resolver = context.getContentResolver();
    ContentProviderClient client = resolver.acquireContentProviderClient("myAuthority");
    MyContentProvider provider = (MyContentProvider) client.getLocalContentProvider();
    provider.resetDatabase();
    client.release();
    

    Add the reset method to your ContentProvider implementation:

    public void resetDatabase() {
        mDatabaseHelper.close();
        mDatabaseHelper = new MyDatabaseOpenHelper(context);
    }
    
    0 讨论(0)
  • 2020-12-16 22:38

    You can also simply use the delete method without a selection:

    context.getContentResolver().delete(YourProvider.CONTENT_URI, null, null);
    
    0 讨论(0)
  • 2020-12-16 22:40

    Here is my solution.

    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() use getDbHelper() to obtain an SQLiteDatabase

    The full code of my Android app is available here if you need more info.

    0 讨论(0)
  • 2020-12-16 22:49

    Are you maintaining a reference to the actual SQLiteDatabase in your content provider (something like calling SQLiteOpenHelper.getWritableDatabase() in onCreate() and then keeping that reference)? Or do you get the DB object from someplace like a helper in each provider method?

    Typically, if you only keep a local reference to the helper and get the writable/readable database instance inside of each method as needed then this problem should go away. If not, perhaps we can take a look at the provider code?

    Hope that Helps!

    0 讨论(0)
提交回复
热议问题