Zaimplementowałem BackupAgentHelper
użycie dostarczonego FileBackupHelper
do tworzenia kopii zapasowych i przywracania natywnej bazy danych, którą mam. Jest to baza danych, z której zwykle korzystasz ContentProviders
i która znajduje się w /data/data/yourpackage/databases/
.
Można by pomyśleć, że to powszechny przypadek. Jednak dokumentacja nie jest jasna, co należy zrobić: http://developer.android.com/guide/topics/data/backup.html . Nie ma BackupHelper
specjalnie dla tych typowych baz danych. Dlatego użyłemFileBackupHelper
, wskazałem na mój plik .db w " /databases/
", wprowadziłem blokady wokół wszelkich operacji db (takich jak db.insert
) w moim ContentProviders
, a nawet próbowałem utworzyć /databases/
katalog " " wcześniej, onRestore()
ponieważ nie istnieje po instalacji.
W przeszłości wdrożyłem podobne rozwiązanie dla SharedPreferences
pomyślnie w innej aplikacji. Jednak kiedy testuję moją nową implementację w emulatorze-2.2, widzę tworzenie kopii zapasowej LocalTransport
z dzienników, a także wykonywanie (i onRestore()
wywoływanie) przywracania . Jednak sam plik db nigdy nie jest tworzony.
Zwróć uwagę, że dzieje się to po instalacji, a przed pierwszym uruchomieniem aplikacji, po wykonaniu przywracania. Poza tym moja strategia testowa opierała się na http://developer.android.com/guide/topics/data/backup.html#Testing .
Proszę również zauważyć, że nie mówię o jakiejś bazie danych sqlite, którą sam zarządzam, ani o tworzeniu kopii zapasowych na karcie SD, na własnym serwerze lub w innym miejscu.
Widziałem wzmiankę w dokumentach o bazach danych zalecających używanie niestandardowego BackupAgent
ale nie wydaje się to być powiązane:
Jednak możesz bezpośrednio rozszerzyć BackupAgent, jeśli potrzebujesz: * Utworzyć kopię zapasową danych w bazie danych. Jeśli masz bazę danych SQLite, którą chcesz przywrócić, gdy użytkownik ponownie zainstaluje Twoją aplikację, musisz utworzyć niestandardowy BackupAgent, który odczytuje odpowiednie dane podczas operacji tworzenia kopii zapasowej, a następnie utwórz tabelę i wstaw dane podczas operacji przywracania.
Proszę o wyjaśnienie.
Jeśli naprawdę muszę to zrobić samodzielnie do poziomu SQL, martwię się następującymi tematami:
Otwarte bazy danych i transakcje. Nie mam pojęcia, jak zamknąć je z takiej pojedynczej klasy poza przepływem pracy mojej aplikacji.
Jak powiadomić użytkownika, że trwa tworzenie kopii zapasowej, a baza danych jest zablokowana. Może to zająć dużo czasu, więc może być konieczne wyświetlenie paska postępu.
Jak zrobić to samo przy przywracaniu. Jak rozumiem, przywrócenie może nastąpić właśnie wtedy, gdy użytkownik zaczął już korzystać z aplikacji (i wprowadzać dane do bazy danych). Nie możesz więc zakładać, że po prostu przywrócisz kopię zapasową danych w miejscu (usuwając puste lub stare dane). Będziesz musiał jakoś się do niego przyłączyć, co dla każdej nietrywialnej bazy danych jest niemożliwe ze względu na identyfikator.
Jak odświeżyć aplikację po zakończeniu przywracania bez utknięcia użytkownika w jakimś - teraz - nieosiągalnym punkcie.
Czy mogę mieć pewność, że baza danych została już zaktualizowana podczas tworzenia kopii zapasowej lub przywracania? W przeciwnym razie oczekiwany schemat może nie być zgodny.