2013-09-25 11 views
5

Ich habe viele Threads über die neue WAL-Standardeinstellung in ios7 SQLite/Core Data Stack gelesen.ios7 sqlite Datenbank mit WAL synchronisiert nie die Hauptdatenbankdatei

Es sah in erster Linie nach einer guten Idee aus ... Allerdings muss ich von Zeit zu Zeit eine Datenbankkopie an einen entfernten Webservice gemäß meinen Geschäftsanforderungen erstellen. Momentan speichere ich nur die SQLITE-Datei und kann die 2 anderen Dateien nicht zur Webservice-Operation hinzufügen, die ich verwende. Das bedeutet, dass mein Backup eindeutig nicht auf dem neuesten Stand ist, also ziemlich sinnlos.

Andere Leute schlagen vor, dass ich WAL mit journal_mode = DELETE (NSSQLitePragmasOption) deaktivieren sollte, was für mich eine akzeptable Problemumgehung ist. Trotzdem fühle ich mich nicht wohl dabei. Es fühlt sich an, als verpasse ich eine recht ordentliche Leistung.

Idealerweise würde ich gerne Core Data/SQLite anweisen, die SHM/WAL mit der Hauptdatendatei zu synchronisieren und dann die Sicherung durchzuführen. Gibt es einen Weg dies zu tun, ohne verrückte private oder undokumentierte APIs auszugraben?

+0

Gibt es eine Lösung? –

+0

Ich habe das gleiche Problem. Ich ziehe von ios 6 zu ios 7 um, ios6 scheint nur .sqlite-Datei zu haben, um Daten zu speichern. Aber ios7 hat .SM und .WAL-Datei. Ich benutze FileWrapper, um die Dateien in einer einzigen Datei zu speichern. Wenn ich in iOS7 * .SM und * .WAL nicht deaktiviere, dann kann iOS6 die in iOS7 backuped Datei nicht verwenden – JimZ

+0

Ich ging für die einfache Option (der frühere Standardmodus). Ich habe keine gute Lösung gefunden. –

Antwort

2

Um , öffnen Sie die Datenbankdatei und führen Sie die SQL-Anweisung PRAGMA wal_checkpoint(RESTART).

+0

Können Sie bitte ein Beispiel angeben? Es sieht so aus, als ob es auch die Datenbank braucht? Können Sie es von einem managedContext oder etwas bekommen? –

+3

Nie eine gute Idee, direkt mit SQLite zu sprechen, wenn Sie Core Data verwenden. Sie sollten dazu Objective-C-Methoden zu Ihrem eigenen Vorteil verwenden. –

2
$ sqlite3 yourFile.sqlite 
SQLite version 3.7.12 2012-04-03 19:43:07 
Enter ".help" for instructions 
Enter SQL statements terminated with a ";" 
sqlite> PRAGMA wal_checkpoint(RESTART); 
0|20|20 
sqlite> .exit 
$