Ist es möglich, Daten zu verlieren, wenn eine SQLite -DB nicht geschlossen ist?
-
26-09-2019 - |
Frage
Ist es möglich, Daten zu verlieren, wenn eine SQLite -DB in iOS/iPhone nicht richtig geschlossen ist?
Ich dachte darüber nach applicationWillTerminate
, aber möchten sicherstellen, dass dies zuerst keine bösen Nebenwirkungen hat.
Lösung
Größtenteils nein; SQLITE3 schreibt alles auf "Festplatten" (und nennt sie fflush/fsync/etc), bevor er zurückkehrt.
Es gibt eine große Ausnahme: Wenn es beim Schließen der Datenbank eine nicht übereinstimmende Transaktion gibt, wird sie beim nächsten Öffnen zurückgerollt.
Was genau passiert, hängt davon ab Pragma journal_mode: Wenn es sich um "Speicher" oder "Aus" handelt, ist die Datenbank wahrscheinlich beschädigt, wenn Ihre App während eines Schreibens abstürzt. ich denken Pragma Locking_Mode beeinflusst nur, was passiert, wenn Schlösser freigesetzt werden, nicht die Transaktionsintegrität.
Beachten Sie, dass -Anwendungsteg: sowieso nicht ausreichend ist! Wenn Sie UIAPPLICATIONExitSonsususpend nicht festgelegt haben, besteht das Standardverhalten auf iOS 4 und ein neuer Gerät (dh neuer als iPhone 3G/IPOD 2G) darin, -Anwendungsarbeiten zu senden: und dann Ihre App (anscheinend mit Sigstop) suspendieren. Wenn das Betriebssystem später entscheidet, dass Ihre App beenden muss, sendet es Sigkill, ohne Ihrer App weitere CPU -Zeit zu geben. Sie müssen Staat in speichern beide -applicationWillTerminate:
und -applicationWillEnterBackground:
; Der Hauptunterschied besteht darin, dass Sie im letzteren eine Hintergrundaufgabe beginnen können.
(Der andere Unterschied besteht darin, dass Sie möglicherweise in der Anwendung "Aufräumarbeiten" durchführen. .))