Backup auf SD Karte -> Fehler

  • Antworten:3
Maximilian O
  • Forum-Beiträge: 990

25.01.2012, 15:35:01 via Website

Hey Leute,
ich möchte in meine BeFit App gerne eine Funktion zum Backup/ Wiederherstellung der Datenbank integrieren. Die Funktion klappt auch wunderbar in der Vollversion, kein Problem. Jetzt wollte ich die Funktion in die Free Version übertragen (selber Code), doch plötzlich wird immer nur eine leere Datenbank auf die SD Karte kopiert (obwohl sie nicht leer ist).

Hier ist der Code um die DB zu backupen:
1File sd = Environment.getExternalStorageDirectory();
2File data = Environment.getDataDirectory();
3
4if (sd.canWrite()) {
5 String currentDBPath = "//data//"+ "com.BeFit.pushups.free" +"//files//"+"database.sqlite";
6 String backupDBPath = "befit_pushups_free_database";
7 File currentDB = new File(data, currentDBPath);
8 File backupDB = new File(sd, backupDBPath);
9
10 FileChannel src = new FileInputStream(currentDB).getChannel();
11 FileChannel dst = new FileOutputStream(backupDB).getChannel();
12 dst.transferFrom(src, 0, src.size());
13 src.close();
14 dst.close();
15 Toast.makeText(getBaseContext(), "Backup successful" + backupDB.toString(), Toast.LENGTH_LONG).show();

Habt ihr irgendeine Idee, warum es plötzlich nur eine leere DB backuped?

MfG Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

26.01.2012, 09:10:52 via Website

* Kommst Du durch den "sd.canWrite()" durch?

* Existiert Target Verzeichnis?

* Evtl. "com.BeFit.pushups.free" als mixed-case PackageName. Theoretisch ist das erlaubt - ich würde es aber trotzdem nicht machen.

Gruß
Harald

— geändert am 26.01.2012, 09:12:48

Antworten
Maximilian O
  • Forum-Beiträge: 990

26.01.2012, 14:18:05 via Website

Hallo Harald,
jiip, ich komme durch sd.canWrite() durch. Am Ende wird mit auch das Toast angezeigt.

Ich habe mir jetzt nocheinmal das Backup der Vollversion angesehen. Also auch da geht irgendetwas schief. Ich bekomme immer ganz andere Daten zurück, als eigtl vorhanden sind. Obwohl ich die Datei vorher (falls vorhanden) auf der SD Karte lösche.

Die Daten welche auf der SD Karte leigen sind auf jeden Fall nicht die neuesten (da ich mir die Db ja über DDMS ansehen kann).
Beispielsweise sind manche Tabellen einfach leer.

Hast du evtl eine andere Idee die DB zu backupen? Oder ist mein Code fehlerhaft?

MfG Maximilian

Vergiss nie wieder Geburtstage, oder viel schlimmer, deinen Hochzeitstag - Birthdays Download

Antworten
Gelöschter Account
  • Forum-Beiträge: 24

26.01.2012, 15:25:36 via Website

Hallo,

ich mach es in meinen Apps immer gleich - z.B. im Tankbuch. Ich nutze die Apache FileUtils für das Kopieren. Die Methoden in MyApplication und MySQLiteOpenHelper liefern mir den voll qualifizierten Namen der Datenbankdatei (/data/data/.../zumbeispiel.db) sowie den einfachen Namen der Datenbankdatei (zumbeispiel.db). Ich halte in MyApplication eine einzelne Instanz der Datenbank die von allen Applikationsbestandteilen verwendet wird - deshalb das komische Konstrukt:

1public boolean backup() {
2 boolean rc = false;
3
4 if (Tools.isSDCardWriteable()) {
5 File file = new File(MyApplication.getSqliteOpenHelper().getDatenbankDatei());
6 File fileBackupDir = new File(Environment.getExternalStorageDirectory(), appName + "/backup");
7 if (!fileBackupDir.exists()) {
8 fileBackupDir.mkdirs();
9 }
10
11 if (file.exists()) {
12 Calendar calendar = Calendar.getInstance();
13 File fileBackup = new File(fileBackupDir, MySQLiteOpenHelper.getDatenbankName() + ".version_" + MySQLiteOpenHelper.getDatenbankVersion() + ".backup_" + Tools.formatRawDatumuhrzeit(calendar));
14 try {
15 FileUtils.copyFile(file, fileBackup);
16 rc = true;
17 } catch (IOException ioException) {
18 if (MyPreferenceActivity.DEBUG) Log.d("DatenbankTools:backup", ioException.getMessage());
19 } catch (Exception exception) {
20 if (MyPreferenceActivity.DEBUG) Log.d("DatenbankTools:backup", exception.getMessage());
21 }
22 }
23 }
24
25 return rc;
26 }

Hast Du es mal ohne mixed-case Packagenamen versucht?

Gruß
Harald

— geändert am 26.01.2012, 15:27:07

Antworten