2013-08-19 10 views
7

in meiner app brauche ich ein Backup meiner Datenbank erhalten, aber nachdem ich werde es wieder brauchen wiederherstellen,ist es möglich, eine Datenbankdatei in android sichern und WIEDERHERSTELLEN? nicht Root-Geräte

i Somethings gelesen haben, aber ich weiß nicht sicher, ob dies notwendig ist, eine rooted zu haben Gerät, Ich brauche Backup/Restore alle Daten in Nicht-Root-Geräten, ist es möglich?

Meine erste Idee war das Erstellen einer TXT-Datei zum Schreiben der Auswahl, und später erneut einfügen.

aber ich glaube, das ist viel "Problem", dann weiß ich nicht, ob dies möglich ist kopieren Sie die Datenbank und fügen Sie in SD-Karte für die Sicherung, und kopieren Sie von SD-Karte und fügen Sie im Pfad der Datenbank für die Wiederherstellung für nicht root Geräte.

+0

Sie arbeiten zu können Ihre Datenbank in einem nicht verwurzelt Gerät mit mit dem folgenden sichern: http://stackoverflow.com/questions/17883447/how-to- check-database-on-nicht-gerootet-android-device/17883556 # 17883556 – TronicZomB

+0

@TronicZomB funktioniert es auch für die Wiederherstellung, für nicht gerootete Geräte? – angel

+0

Nicht sicher. Sie müssen das ausprobieren oder weiter suchen. – TronicZomB

Antwort

29

Hier ist ein Code, um es

private void importDB() { 
     try { 
      File sd = Environment.getExternalStorageDirectory(); 
      File data = Environment.getDataDirectory(); 
       if (sd.canWrite()) { 
       String currentDBPath = "//data//" + "<package name>" 
         + "//databases//" + "<database name>"; 
       String backupDBPath = "<backup db filename>"; // From SD directory. 
       File backupDB = new File(data, currentDBPath); 
       File currentDB = new File(sd, backupDBPath); 

      FileChannel src = new FileInputStream(backupDB).getChannel(); 
      FileChannel dst = new FileOutputStream(currentDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
      Toast.makeText(getApplicationContext(), "Import Successful!", 
        Toast.LENGTH_SHORT).show(); 

     } 
    } catch (Exception e) { 

     Toast.makeText(getApplicationContext(), "Import Failed!", Toast.LENGTH_SHORT) 
       .show(); 

    } 
} 

private void exportDB() { 
    try { 
     File sd = Environment.getExternalStorageDirectory(); 
     File data = Environment.getDataDirectory(); 

     if (sd.canWrite()) { 
      String currentDBPath = "//data//" + "<package name>" 
        + "//databases//" + "<db name>"; 
      String backupDBPath = "<destination>"; 
      File currentDB = new File(data, currentDBPath); 
      File backupDB = new File(sd, backupDBPath); 

      FileChannel src = new FileInputStream(currentDB).getChannel(); 
      FileChannel dst = new FileOutputStream(backupDB).getChannel(); 
      dst.transferFrom(src, 0, src.size()); 
      src.close(); 
      dst.close(); 
      Toast.makeText(getApplicationContext(), "Backup Successful!", 
        Toast.LENGTH_SHORT).show(); 

     } 
    } catch (Exception e) { 

     Toast.makeText(getApplicationContext(), "Backup Failed!", Toast.LENGTH_SHORT) 
       .show(); 

    } 
} 
+0

ja, dies funktionierte für Nicht-Root-Geräte :) – angel

+1

Sie könnten eine Methode "CopyDB" oder extrahieren etwas anderes anstelle des gleichen Codes in beiden Methoden. Dies würde die Modularität erhöhen. Darüber hinaus wäre das Schließen aller geöffneten Streams in final blocks in Ordnung =) – Thorben

+0

Außerdem sollte der aktuelle Datenbankpfad über 'getDatabasePath (" ")' robuster sein. – Thorben

Verwandte Themen