OStack程序员社区-中国程序员成长平台

标题: ios - 如果 sqlite DB 未关闭,是否有可能丢失数据? [打印本页]

作者: 菜鸟教程小白    时间: 2022-12-13 06:01
标题: ios - 如果 sqlite DB 未关闭,是否有可能丢失数据?

如果 SQLite DB 在 iOS/iPhone 中未正确关闭,是否会丢失数据?

我正在考虑在 applicationWillTerminate 中关闭数据库,但首先要确保这不会产生任何令人讨厌的副作用。



Best Answer-推荐答案


在大多数情况下,没有; 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/






欢迎光临 OStack程序员社区-中国程序员成长平台 (https://ostack.cn/) Powered by Discuz! X3.4