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