【问题标题】:SQLite Persistence throughout app lifecycle on iOS在 iOS 上的整个应用生命周期中的 SQLite 持久性
【发布时间】:2026-02-20 07:55:02
【问题描述】:

我一直在阅读 iOS 固件中包含的 SQLite3,它可能满足我正在编写的应用程序的需求。

我不知道它是持久的还是像某些对象一样消失了。

例如,如果我执行sqlite3_open(),它似乎是一个 C 函数而不是一个 Objective-C 对象,如果我在我的应用程序开始时打开它,它会一直保持直到我关闭它,无论有多少视图我到处推/弹出。

显然,这取决于我把它放在哪里,但如果我在做一个通用应用程序并且有一些用于加载/保存 iPhone/iPad 通用的数据的中心功能,如果在我的didFinishLoading 中:我放了一个调用以打开 SQLite 数据库,然后调用各种 exec 的查询,它是否会在应用程序的整个生命周期中保持持久性。

我最好根据需要打开和关闭,我来自 PHP 背景,所以我通常会在脚本开始时打开一个数据库,然后运行许多查询,最后在浏览器输出之前关闭它。

从过去几个月我了解的第 1,000,000 次 iOS 编程中,我认为后者可能是更好的方法,因为应用程序可能会过早退出或进入后台。

我只想对我的想法提出第二意见。

【问题讨论】:

    标签: ios sqlite


    【解决方案1】:

    我不直接知道,但我认为你是对的 - 你只需要在你的应用程序开始时打开它一次。

    看看sqlitepersistentobjects,一个iOS的ORM框架,它只在第一次使用时opens the DB,除非打开有问题,否则永远不会关闭它:)

    【讨论】:

    • 谢谢 Chris,如果需要很多请求,我担心打开/读取/关闭的开销
    【解决方案2】:

    在整个应用程序中从应用程序的不同位置使用单个打开的 sqlite 数据库是可以的。

    您使用的“持久”一词令人困惑。您的意思是“重用单个连接,用于在应用程序中执行不同的语句,可能来自不同的线程”。持久性在数据库上下文中具有完全不同的含义 - 这意味着请求的数据修改已安全地存储到媒体(磁盘、闪存驱动器)中,并且设备甚至可以在不影响写入数据的情况下意外关闭。

    建议从单个专用线程继续运行 sqlite 语句。

    不建议从不同进程连接到sqlite数据库进行并行修改。

    一个很好的替代解决方案是使用 sqlite 异步扩展,它将所有写入发送到专用的后台线程。

    如果您想使用自定义构建(较新版本)的 sqlite,可以查看https://github.com/mirek/CoreSQLite3 框架。

    【讨论】: