代码之家  ›  专栏  ›  技术社区  ›  hpique

如果sqlite数据库未关闭,是否可能丢失数据?

  •  2
  • hpique  · 技术社区  · 15 年前

    如果在iOS/iPhone中没有正确关闭SQLite数据库,是否可能丢失数据?

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   tc.    15 年前

    在大多数情况下,不会;sqlite3在返回之前将所有内容写入“磁盘”(并根据需要调用fflush/fsync/etc)。

    有一个大的例外:如果在关闭数据库时有一个未提交的事务,则下次打开它时将回滚该事务。

    到底发生了什么取决于 PRAGMA journal_mode :如果是“内存”或“关闭”,则在写入过程中应用程序崩溃时,数据库可能会损坏。我 认为 PRAGMA locking_mode 只影响释放锁时发生的事情,而不影响事务完整性。

    注意-applicationWillTerminate:无论如何都不够! 如果还没有设置UIAptudioExtSunStand,IOS 4上的默认行为和一个新的足够的设备(即比iPhone 3G/iPod 2G更新)将发送-Apple WieldCurnLead:然后暂停应用程序(显然是用SIGSTOP)。如果操作系统后来决定你的应用程序需要退出,它会发送SIGKID而不给你的应用程序更多的CPU时间。你需要保存状态 二者都 -applicationWillTerminate: 和 -applicationWillEnterBackground: ;主要区别在于,您可以在后者中启动后台任务。

    (另一个区别是,你可能会在应用程序中做一些“清理”,终止:当你刚移动到后台时,不应该发生这种情况,即使在你的应用程序即将退出时释放内存很大程度上是浪费CPU时间。)