如果在iOS / iPhone中没有正确关闭SQLite数据库,是否可能丢失数据?
我在考虑关闭applicationWillTerminate
中的数据库,但想确保首先没有任何令人讨厌的副作用。
答案 0 :(得分:3)
在大多数情况下,没有; sqlite3将所有内容写入" disk" (并在适当时调用fflush / fsync / etc),然后返回。
有一个很大的例外:如果关闭数据库时出现未提交的事务,则下次打开它时会回滚它。
究竟发生了什么取决于PRAGMA journal_mode:如果它是"记忆"或" off"如果您的应用在写入过程中崩溃,数据库可能会损坏。我认为 PRAGMA locking_mode只会影响发布锁定时发生的事情,而不会影响事务完整性。
请注意-applicationWillTerminate:还不够!如果你还没有设置UIApplicationExitsOnSuspend,iOS 4上的默认行为和足够新的设备(比iPhone 3G / iPod更新) 2g)是发送-applicationWillEnterBackground:然后暂停你的应用程序(显然是用SIGSTOP)。如果操作系统稍后决定您的应用程序需要退出,它会发送SIGKILL,而不会给您的应用程序更多的CPU时间。您需要在 {/ em> -applicationWillTerminate:
和-applicationWillEnterBackground:
中保存状态。主要区别在于您可以在后者中启动后台任务。
(另一个不同之处在于你可能会做一些"清理" in -applicationWillTerminate:当你刚刚搬到后台时不会发生这种情况,即使你的内存释放时也是如此app即将退出主要是浪费CPU时间。)