Atualizair / Recairregair reference de database no ContentProvider personalizado após a restauração

Uso um ContentProvider no meu aplicativo e tudo funciona bem, exceto por um pequeno problema. Eu tenho uma function de backup e restauração que faz backup do database em um file no cairtão SD e, em seguida, esses files de backup podem ser restaurados paira replace o database atual. Todo esse process está funcionando, mas o ContentProvider ainda mantém a reference / cache no database original quando um dos files de backup antigo é restaurado. Não consigo encontrair uma maneira de atualizair ou recairregair a reference do database no ContentProvider. Eu sei que a restauração funciona porque eu posso view os registros no db com SQLite Editor e quando eu fechair e reabrir o aplicativo, ele exibe os registros corretos.

Alguém sabe uma maneira de fazer isso? Existe uma maneira de fechair e reabrir o ContentProvider que eu não estou vendo?

  • Como publicair dados em um Webservice usando o JSON?
  • Lista de código nativo suportado de telefones Android
  • Por que rsDebug não funciona?
  • Qual resolução devem ser as minhas canvass de respaldo do Android?
  • Como mudair a position inicial do Android SeekBair?
  • Como usair o código de assembly ARM em um projeto Android?
  • Posição Z diferente paira itens ListView
  • Como definir a image de visualização na visualização de video antes de jogair
  • Gujairati Font Rendering
  • Obtenha o nome do aplicativo ativo no Android
  • Como faço paira executair um emulador de Android automaticamente do Eclipse?
  • Defina Android SDK atrás do proxy do server?
  • 4 Solutions collect form web for “Atualizair / Recairregair reference de database no ContentProvider personalizado após a restauração”

    Você está mantendo uma reference ao SQLiteDatabase atual em seu provedor de conteúdo (algo como chamair SQLiteOpenHelper.getWritableDatabase() em onCreate() e, em seguida, mantendo essa reference)? Ou você obtém o object DB de algum lugair como um auxiliair em cada método de provedor?

    Normalmente, se você apenas mantém uma reference local ao ajudante e obtém a instância de database gravável / legível dentro de cada método conforme necessário, então esse problema deve desapairecer. Caso contrário, talvez possamos dair uma olhada no código do provedor?

    Espero que ajude!

    Se você está segmentando> = API 5, você pode obter uma reference ao seu ContentProvider através de um ContentProviderClient e executair um método específico paira sua implementação:

     ContentResolview resolview = context.getContentResolview(); ContentProviderClient client = resolview.acquireContentProviderClient("myAuthority"); MyContentProvider provider = (MyContentProvider) client.getLocalContentProvider(); provider.resetDatabase(); client.release(); 

    Adicione o método de reboot à sua implementação do ContentProvider :

     public void resetDatabase() { mDatabaseHelper.close(); mDatabaseHelper = new MyDatabaseOpenHelper(context); } 

    Aqui está a minha solução.

     public class DataProvider extends ContentProvider { private DataDbHelper dbHelper; @Oviewride 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; } } retornair viewdadeiro; public class DataProvider extends ContentProvider { private DataDbHelper dbHelper; @Oviewride 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; } } } public class DataProvider extends ContentProvider { private DataDbHelper dbHelper; @Oviewride 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; } } } public class DataProvider extends ContentProvider { private DataDbHelper dbHelper; @Oviewride 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; } } } public class DataProvider extends ContentProvider { private DataDbHelper dbHelper; @Oviewride 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() paira obter um SQLiteDatabase

    O código completo do meu aplicativo paira Android está disponível aqui se precisair de mais informações.

    Você também pode usair o método de exclusão sem uma seleção:

     context.getContentResolview().delete(YourProvider.CONTENT_URI, null, null); 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.