如果 SQLite DB 在 iOS/iPhone 中未正确关闭,是否有可能丢失数据?
我正在考虑关闭数据库applicationWillTerminate
,但首先要确保这没有任何令人讨厌的副作用。
如果 SQLite DB 在 iOS/iPhone 中未正确关闭,是否有可能丢失数据?
我正在考虑关闭数据库applicationWillTerminate
,但首先要确保这没有任何令人讨厌的副作用。
在大多数情况下,不;sqlite3 在返回之前将所有内容写入“磁盘”(并酌情调用 fflush/fsync/etc)。
有一个很大的例外:如果关闭数据库时有未提交的事务,下次打开时它会回滚。
究竟会发生什么取决于PRAGMA journal_mode:如果它是“内存”或“关闭”,如果您的应用程序在写入期间崩溃,数据库可能会损坏。我认为 PRAGMA 锁定模式仅影响释放锁时发生的情况,而不影响事务完整性。
请注意 -applicationWillTerminate: 无论如何是不够的!如果您还没有设置 UIApplicationExitsOnSuspend,iOS 4 和足够新的设备(即比 iPhone 3G/iPod 2g 更新)上的默认行为是发送 -applicationWillEnterBackground: 然后暂停您的应用程序(显然使用 SIGSTOP)。如果操作系统稍后决定您的应用程序需要退出,它会发送 SIGKILL 而不给您的应用程序更多的 CPU 时间。您需要在两者 -applicationWillTerminate:
中保存状态-applicationWillEnterBackground:
; 主要区别在于您可以在后者中启动后台任务。
(另一个区别是您可能会在 -applicationWillTerminate 中进行一些“清理”:当您刚刚移动到后台时不应该发生这种情况,即使在您的应用程序即将退出时释放内存在很大程度上是浪费 CPU 时间.)