Domanda

E 'possibile perdere se i dati di un DB SQLite non è chiusa correttamente in iOS / iPhone?

Stavo pensando di chiudere il DB in applicationWillTerminate, ma vuole assicurarsi che questo non ha effetti collaterali sgradevoli prima.

È stato utile?

Soluzione

Per la maggior parte, no; sqlite3 scrive di tutto per "disco" (e le chiamate fflush / fsync / etc a seconda del caso) prima di ritornare.

C'è una grande eccezione:. Se c'è una transazione senza commit quando si chiude il database, sarà il rollback la prossima volta che lo si apre

Esattamente ciò che accade dipende PRAGMA journal_mode : se si tratta di "memoria" o "off ", il database è probabile che sia corrotto se la vostra applicazione va in crash durante una scrittura. I pensare PRAGMA locking_mode effetto solo su ciò che accade quando le serrature vengono rilasciati , non l'integrità delle transazioni.

Nota che -applicationWillTerminate: non è comunque sufficiente Se non è stato impostato UIApplicationExitsOnSuspend, il comportamento di default su iOS 4 e un dispositivo di nuova sufficiente (cioè più recente rispetto a iPhone 3G / iPod 2G) è quello di inviare -applicationWillEnterBackground: e quindi sospendere l'applicazione (a quanto pare con SIGSTOP). Se il sistema operativo decide in seguito che la vostra applicazione ha bisogno di uscire, invia SIGKILL senza dare la vostra applicazione più tempo di CPU. È necessario salvare lo stato in sia e -applicationWillTerminate: -applicationWillEnterBackground:; la differenza principale è che è possibile avviare un task in background in quest'ultimo.

(L'altra differenza è che si potrebbe fare un po 'di "pulizia" in -applicationWillTerminate: questo non dovrebbe accadere quando si è appena trasferita in secondo piano, anche se liberando memoria quando la vostra applicazione è in procinto di uscita è in gran parte uno spreco di tempo di CPU.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top