# SQLite Datenbank sichern/in ein anderes Verzeichnis kopieren



## jhjh (29. Aug 2018)

Hallo,

ich habe eine SQLite Datenbank die sich in /data/data/com.example.prototyp/database/mydb.dat befindet. Diese Datenbank wollte ich jetzt irgendwie „sichern“, sodass ich problemlos an meiner Datenbank herumspielen kann und die ursprüngliche Datenbank wieder aufspielen kann. Da ich nur über Root-Rechte auf die Datenbank zugreifen kann, wollte ich mein Handy rooten, um die Datenbank aus dem Ordner rauskopieren zu können. Das ist meinem China Handy (Blackview A7) leider nicht so ganz leicht. Bei meinem Droid4X-Emulator war das kein Problem. Nun habe ich mir gedacht, dass ich mir die Datei doch sicherlich irgendwie mit Java in ein anderes Verzeichnis (bei dem ich auch ohne Root-Rechte zugriff habe) verschieben bzw. kopieren kann.

Mit folgendem Code habe ich das versucht:


```
try {
    File backupDB = new File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS), "mydb.dat"); 
    File currentDB = getApplicationContext().getDatabasePath("/data/data/com.example.prototyp/database/mydb.dat");    

if (currentDB.exists()) {
        FileInputStream fis = new FileInputStream(currentDB);
        FileOutputStream fos = new FileOutputStream(backupDB);
        fos.getChannel().transferFrom(fis.getChannel(), 0, fis.getChannel().size());

        fis.close();
        fos.close();
        Log.i("Database successfully", " copied to download folder");

    } else Log.i("Copying Database", " fail, database not found");
} catch (IOException e) {
    Log.d("Copying Database", "fail, reason:", e);
```

Das funktioniert leider nicht. Die Datenbank wird nicht gefunden. Der Pfad sollte aber korrekt sein. In der Manifest habe ich die entsprechende Berechtigung hinzugefügt:

```
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
```
Kann mir jemand bei meinem Vorhaben helfen ? Villeicht geht es ja auch auf eine andere Weise. Das Hauptziel ist, dass ich meine Datenbank sichern kann, damit ich die Datensätze nicht immer wieder neu einpflegen muss.

Ich bedanke mich


----------



## dzim (30. Aug 2018)

Ist schon ewig her, dass ich so etwas gebaut habe. Damals habe ich aus dem Context den Pfad der DB so geholt `mContext.getDatabasePath(MyConstants.DB_NAME);` (der Name den man da im SQLiteOpenHelper angeben musste - heute gibt es ja die Room-API, da habe ich keine Ahnung mehr, wie man das heute so macht).
Damit sollte es gehen, die interne DB zu finden und kopieren.

Andersherum kannst du mit folgenden Schnippsel auch Files von irgendwo als SQLite-DB laden

```
public static SQLiteDatabase openDatabase(File source) {
    if (source == null || !source.isFile()) {
        return null;
    }
    return SQLiteDatabase.openDatabase(source.getAbsolutePath(), null, SQLiteDatabase.NO_LOCALIZED_COLLATORS | SQLiteDatabase.OPEN_READONLY);
}
```

Aber wie gesagt: Ich bin etwas eingerostet, was Android angeht, daher weiss ich nicht, wie aktuell der Code noch ist...


----------



## jhjh (31. Aug 2018)

Hey, danke für die Antwort.
Habe es mittlerweile hinbekommen einen Backup meiner Datenbank zu erstellen! Die entsprechende Backup Datei war lediglich "unsichtbar". Erst als ich über einen SQLiteManager auf meinen Speicher zugegriffen habe, habe ich die entsprechende Datei gefunden!


----------

