Mam podstawową aplikację opartą na danych, która używa Dropbox do tworzenia kopii zapasowych i przywracania danych. Sposób tworzenia kopii zapasowych jest dość prosty. Kopiuję plik .sqlite w dropboxie użytkownika.Tworzenie kopii zapasowej .sqlite (dane podstawowe)
Teraz moja funkcja tworzenia kopii zapasowych i przywracania działa poprawnie. Problem dotyczy samego pliku .sqlite. Wygląda na to, że plik .sqlite to niekompletny.
Wprowadziłem około 125 zgłoszeń do mojej aplikacji i wykonałem kopię zapasową. Kopia zapasowa pojawiła się w mojej skrzynce, ale kiedy używam narzędzia eksploratora .sqlite, aby zobaczyć zawartość, widzę tylko zapisy do 117. wpisu.
Próbowałem zaktualizować pierwszy wpis, a następnie ponownie obserwować plik .sqlite, ale nie wprowadzono żadnych zmian.
Co jeszcze dziwniejsze, aplikacja wydaje się rejestrować wszystkie zmiany. Po dodaniu nowego wpisu lub aktualizacji istniejącego i ponownym uruchomieniu aplikacji wydaje się, że nowo dodane dane pozostają. Ale te nowo dodane dane nie pojawiają się w moim pliku .sqlite.
mam kopii zapasowej przy użyciu tego kodu:
AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
NSString *filePath = [[[appDelegate applicationDocumentsDirectory] path] stringByAppendingPathComponent:@"MyApp.sqlite"];
if (account) {
if ([filesystem isShutDown]) {
filesystem = [[DBFilesystem alloc] initWithAccount:account];
[DBFilesystem setSharedFilesystem:filesystem];
}
DBPath *newPath = [[DBPath root] childPath:[NSString stringWithFormat:@"Backup - %@.sqlite", [NSDate date]]];
DBFile *file = [[DBFilesystem sharedFilesystem] createFile:newPath error:nil];
[file writeContentsOfFile:filePath shouldSteal:NO error:nil];
[filesystem shutDown];
}
ja również skopiowany plik .sqlite z folderu symulatorze i próbował widząc go w .sqlite przeglądarce. Wciąż wykazuje to samo zachowanie. Jakiś powód, dlaczego tak się dzieje?
Więc co poleciłbyś? Apple zaleca drugie podejście, ale nie rozumiem, w jaki sposób mogę go użyć w Dropboxie (wygląda na dostosowany do iCloud). Jeśli teraz wyłączyłem tryb WAL, czy utracę dane już wprowadzone?A co myślisz o tworzeniu pliku zip z plikiem .sqlite i plikiem wal i zapisywaniu go jako kopii zapasowej (i odwracaniu w celu przywrócenia)? –
@GauravWadhwani: W tej odpowiedzi http://stackoverflow.com/a/21002923/1187415 stwierdza się, że otwarcie sklepu za pomocą funkcji journal_mode = DELETE nie * nie * niszczy danych użytkownika, ale sam go nie przetestowałem. Drugie podejście polega na tym, że najpierw trzeba wykonać kopię zapasową do oddzielnego (pojedynczego pliku) magazynu, który następnie można przenieść do skrzynki referencyjnej (ale nie jestem zaznajomiony z funkcjami skrzynki referencyjnej). - Przepraszam, nie mogę podać ci rekomendacji. Być może inna odpowiedź przyjdzie i pomoże więcej. –
Dzięki za odpowiedź. Pomógł mi rozwiązać mój problem :) –