如果 sqlite DB 未关闭,是不是有可能丢失数据?
Posted
技术标签:
【中文标题】如果 sqlite DB 未关闭,是不是有可能丢失数据?【英文标题】:Is it possible to lose data if a sqlite DB is not closed?如果 sqlite DB 未关闭,是否有可能丢失数据? 【发布时间】:2010-11-21 16:21:48 【问题描述】:如果 SQLite DB 在 ios/iPhone 中没有正确关闭,是否会丢失数据?
我正在考虑关闭applicationWillTerminate
中的数据库,但首先要确保这不会产生任何令人讨厌的副作用。
【问题讨论】:
【参考方案1】:在大多数情况下,没有; sqlite3 在返回之前将所有内容写入“磁盘”(并酌情调用 fflush/fsync/etc)。
有一个很大的例外:如果关闭数据库时有未提交的事务,下次打开时会回滚。
究竟会发生什么取决于PRAGMA journal_mode:如果它是“内存”或“关闭”,如果您的应用在写入期间崩溃,则数据库可能会损坏。我认为 PRAGMA locking_mode 只影响释放锁时发生的事情,而不影响事务完整性。
请注意,-applicationWillTerminate: 无论如何是不够的! 如果您还没有设置 UIApplicationExitsOnSuspend,iOS 4 和新设备(即比 iPhone 3G/iPod 2g 新)上的默认行为是发送 -applicationWillEnterBackground: 然后挂起您的应用程序(显然使用 SIGSTOP)。如果操作系统稍后决定您的应用程序需要退出,它会发送 SIGKILL 而不给您的应用程序更多的 CPU 时间。您需要将状态保存在 both -applicationWillTerminate:
和 -applicationWillEnterBackground:
;主要区别在于后者可以启动后台任务。
(另一个区别是您可能会在 -applicationWillTerminate 中进行一些“清理”:当您刚刚移动到后台时不应该发生这种情况,即使在您的应用程序即将退出时释放内存在很大程度上是一种浪费CPU 时间。)
【讨论】:
以上是关于如果 sqlite DB 未关闭,是不是有可能丢失数据?的主要内容,如果未能解决你的问题,请参考以下文章
Android - 关闭数据库后可以使用 SQLite 光标吗?
nodejs sqlite 3“SQLITE_MISUSE:数据库句柄已关闭”db.run 中的 db.all
集群中 NFS 上的 SQLite DB。我会收到数据损坏吗?