La restauration de fichier de base de données SQLite

Je suis la mise en œuvre d'une sauvegarde/restauration du système dans mon application android.

Une sauvegarde automatique se fait toutes les deux minutes.
Je suis en train de restaurer ma db fichier de sauvegarde à partir de ma carte sd, après mon application a été désinstallé puis installé de nouveau.

Sauvegarde fonctionne, mais voici le problème:

Chaque fois que l'utilisateur installe mon application, il y a un fichier non trouvé exception, mais, si l'utilisateur ferme l'application, puis l'ouvre à nouveau, la restauration est très bien. En quelque sorte, la restauration des visages problème lorsque l'application est lancé pour la première fois.

La restauration doit se produire au moment du lancement.

Remarque: la backupExists fonction renvoie la valeur true.

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    if(backUpExists()){

        restoreDB();
      }
}
     private boolean backUpExists()
  {
    try{
        File sd = Environment.getExternalStorageDirectory();
        if (sd.canRead()){
            String backupDBPath = "myDB";
             File backupedDB = new File(sd, backupDBPath);
             if(backupedDB.exists()){
                 return true;
             }
        }
    } catch(Exception ex) {
         Toast.makeText(getBaseContext(), ex.toString(), Toast.LENGTH_LONG).show();
    }
        return false;
  }
  private void restoreDB()
  {
    try{
        File sd = Environment.getExternalStorageDirectory();
        File data = Environment.getDataDirectory();

        if (sd.canWrite()) {
            String restroredDBPath = "//data//myPackage//databases//myDB";
            String backupDBPath = "myDB";
            File restoredDB = new File(data, restroredDBPath);
            File backupedDB = new File(sd, backupDBPath);
                FileChannel src = new FileInputStream(backupedDB).getChannel();
                FileChannel dst = new FileOutputStream(restoredDB).getChannel();
                dst.transferFrom(src, 0, src.size());
                src.close();
                dst.close();
                Toast.makeText(getBaseContext(), restoredDB.toString(), Toast.LENGTH_LONG).show();

        }
    } catch (Exception e) {

        Toast.makeText(getBaseContext(), e.toString(), Toast.LENGTH_LONG).show();
    }
  }

Backtrace

09-09 22:49:50.931: I/Database(23206): sqlite returned: error code = 26, msg = statement aborts at 14: [SELECT COUNT(*) FROM Photos WHERE AlbumId=0] file is encrypted or is not a database
09-09 22:49:50.931: D/AndroidRuntime(23206): Shutting down VM
09-09 22:49:50.931: W/dalvikvm(23206): threadid=1: thread exiting with uncaught exception (group=0x4151c700)
09-09 22:49:50.931: E/AndroidRuntime(23206): FATAL EXCEPTION: main
09-09 22:49:50.931: E/AndroidRuntime(23206): net.sqlcipher.database.SQLiteException: file is encrypted or is not a database
09-09 22:49:50.931: E/AndroidRuntime(23206):    at     net.sqlcipher.database.SQLiteQuery.native_fill_window(Native Method)
09-09 22:49:50.931: E/AndroidRuntime(23206):    at net.sqlcipher.database.SQLiteQuery.fillWindow(SQLiteQuery.java:73)
09-09 22:49:50.931: E/AndroidRuntime(23206):    at net.sqlcipher.database.SQLiteCursor.fillWindow(SQLiteCursor.java:290)
[snipped]
Et où, précisément, l'exception se produit? Supprimer la try/catch pour obtenir une bonne trace de la pile.
Je suis un "fichier est crypté ou n'est pas une base de données de" l'exception " droit lorsque j'essaie de requête à l'aide de la restauration DB. Voici la pleine stacktrace: pastebin.com/j4tQU26K
Oublié de le tag 🙂
En quelle classe est-ce code? Est-il possible que le code a déjà essayé d'ouvrir le fichier de base de données?
Oui, c'est possible. Je suis à l'aide d'un singletone DatabaseHelper classe, qui est déjà instancié avant l'opération de restauration. Mais, j'ai essayé de charger les bibliothèques de base de données une fois de plus, et aussi de mettre l'instance de ma base de données sur la valeur null afin de re-créer un nouveau DatabaseHelper objet. Cependant, je suis de la même exception.

OriginalL'auteur idish | 2013-09-05