Ich habe implementiert eine BackupAgentHelper
der vorgesehenen Verwendung FileBackupHelper
zu sichern und wiederherzustellen die native Datenbank ich habe. Dies ist die Datenbank, die Sie normalerweise zusammen mit der Datenbank verwenden ContentProviders
und in der Sie sich befinden /data/data/yourpackage/databases/
.
Man würde denken, dass dies ein häufiger Fall ist. In den Dokumenten ist jedoch nicht klar, was zu tun ist: http://developer.android.com/guide/topics/data/backup.html . Es gibt keine BackupHelper
speziell für diese typischen Datenbanken. Daher habe ich das verwendetFileBackupHelper
, auf meine .db-Datei in " /databases/
" verwiesen , Sperren für alle db-Operationen (wie z. B. db.insert
) in meinem eingeführt ContentProviders
und sogar versucht, das /databases/
Verzeichnis " " vorher zu erstellen, onRestore()
da es nach der Installation nicht vorhanden ist.
Ich habe SharedPreferences
in der Vergangenheit eine ähnliche Lösung für die erfolgreich in einer anderen App implementiert . Wenn ich jedoch meine neue Implementierung im Emulator-2.2 teste, wird eine Sicherung LocalTransport
aus den Protokollen sowie eine Wiederherstellung durchgeführt (und onRestore()
aufgerufen). Die Datenbankdatei selbst wird jedoch nie erstellt.
Beachten Sie, dass dies alles nach einer Installation und vor dem ersten Start der App, nachdem die Wiederherstellung durchgeführt wurde, erfolgt. Abgesehen davon basierte meine Teststrategie auf http://developer.android.com/guide/topics/data/backup.html#Testing .
Bitte beachten Sie auch, dass ich weder über eine von mir selbst verwaltete SQLite-Datenbank noch über das Sichern auf einer SD-Karte, einem eigenen Server oder anderswo spreche.
Ich habe in den Dokumenten eine Erwähnung von Datenbanken gesehen, die die Verwendung eines benutzerdefinierten Benutzers empfehlen, BackupAgent
aber es scheint nicht verwandt zu sein:
Möglicherweise möchten Sie BackupAgent jedoch direkt erweitern, wenn Sie: * Daten in einer Datenbank sichern müssen. Wenn Sie über eine SQLite-Datenbank verfügen, die Sie wiederherstellen möchten, wenn der Benutzer Ihre Anwendung erneut installiert, müssen Sie einen benutzerdefinierten BackupAgent erstellen, der die entsprechenden Daten während eines Sicherungsvorgangs liest. Erstellen Sie dann Ihre Tabelle und fügen Sie die Daten während eines Wiederherstellungsvorgangs ein.
Etwas Klarheit bitte.
Wenn ich es wirklich bis zur SQL-Ebene selbst tun muss, mache ich mir Sorgen um die folgenden Themen:
Öffnen Sie Datenbanken und Transaktionen. Ich habe keine Ahnung, wie ich sie aus einer solchen Singleton-Klasse außerhalb des Workflows meiner App schließen kann.
So benachrichtigen Sie den Benutzer, dass eine Sicherung ausgeführt wird und die Datenbank gesperrt ist. Es kann lange dauern, daher muss ich möglicherweise einen Fortschrittsbalken anzeigen.
So machen Sie dasselbe bei der Wiederherstellung. Soweit ich weiß, kann die Wiederherstellung nur dann erfolgen, wenn der Benutzer die App bereits verwendet hat (und Daten in die Datenbank eingibt). Sie können also nicht davon ausgehen, dass nur die Backupped-Daten wiederhergestellt werden (Löschen der leeren oder alten Daten). Sie müssen sich irgendwie daran beteiligen, was für jede nicht triviale Datenbank aufgrund der IDs unmöglich ist.
So aktualisieren Sie die App nach der Wiederherstellung, ohne dass der Benutzer an einem - jetzt - nicht erreichbaren Punkt hängen bleibt.
Kann ich sicher sein, dass die Datenbank beim Sichern oder Wiederherstellen bereits aktualisiert wurde? Andernfalls stimmt das erwartete Schema möglicherweise nicht überein.