2010-11-21 338 views

回答

3

絕大多數情況下,在返回之前,sqlite3將所有內容寫入「磁盤」(並根據需要調用fflush/fsync/etc)。

有一個很大的例外:如果在關閉數據庫時存在未提交的事務,下次打開它時會回滾。

究竟發生了什麼取決於PRAGMA journal_mode:如果它是「內存」或「關閉」,如果您的應用程序在寫入期間崩潰,數據庫可能會損壞。我想認爲PRAGMA locking_mode隻影響發佈鎖時發生的事情,而不是事務完整性。

請注意,-applicationWillTerminate:是不夠的!如果您尚未設置UIApplicationExitsOnSuspend,則iOS 4和足夠新的設備(即比iPhone 3G/iPod 2g更新)的默認行爲是發送-applicationWillEnterBackground:然後掛起您的應用程序(顯然使用SIGSTOP)。如果操作系統稍後決定您的應用程序需要退出,它將發送SIGKILL,而不會爲應用程序提供更多的CPU時間。您需要保存的狀態-applicationWillTerminate:-applicationWillEnterBackground:;主要區別在於您可以在後者中開始後臺任務。

(另一個不同之處在於,你可能會在-applicationWillTerminate中做一些「清理」:當你剛剛移動到後臺時不應該發生這種情況,即使你的應用即將退出時釋放內存基本上是浪費CPU時間。)

相關問題