2013-08-19 38 views
7

w moim app muszę dostać kopię zapasową mojej bazy danych, ale po Muszę przywrócić go ponownie,jest to możliwe kopii zapasowej i przywrócić plik bazy danych w systemie Android? non urządzenia korzeniowe

czytałem latków, ale nie jestem pewien, czy jest to konieczne, aby mieć ukorzenionych urządzenie, potrzebuję kopii zapasowej/przywracania wszystkich danych na urządzeniach innych niż root, czy to możliwe?

Mój pierwszy pomysł polegał na utworzeniu pliku txt do napisania zaznaczenia, a następnie wstawieniu go ponownie.

ale uważam, że jest to dużo "problem", to nie wiem, czy jest to możliwe skopiować bazę danych i wkleić w karty SD do tworzenia kopii zapasowych, i skopiować z karty SD i wkleić w ścieżce bazy danych do przywracania dla nie root pomysłowość.

+0

Można wykonać kopię zapasową bazy danych w nie zakorzenione urządzenia z wykorzystaniem następujących czynności: http://stackoverflow.com/questions/17883447/how-to- check-database-on-not-root-android-device/17883556 # 17883556 – TronicZomB

+0

@TronicZomB czy to działa również w przypadku przywracania, dla urządzeń nierootowanych? – angel

+0

Nie jestem pewien. Będziesz musiał to wypróbować lub dalej szukać. – TronicZomB

Odpowiedz

29

Oto kod, aby to działało

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

tak, działało to dla urządzeń innych niż root :) – angel

+1

Można wyodrębnić metodę "copyDB" lub coś innego zamiast używania tego samego kodu w obu metodach. Zwiększyłoby to modułowość. Oprócz tego zamknięcie wszystkich otwartych strumieni w końcowych blokach byłoby w porządku =) – Thorben

+0

Poza tym uzyskanie bieżącej ścieżki db przez 'getDatabasePath (" >) "powinno być bardziej niezawodne. – Thorben