如何强制更新 CoreData SQLite 数据库?

Posted

技术标签:

【中文标题】如何强制更新 CoreData SQLite 数据库?【英文标题】:How can I force update in a CoreData SQLite database? 【发布时间】:2016-05-19 21:12:42 【问题描述】:

我有一个应用程序,我使用 CoreData 来存储数据。 一切正常,但我想轻松访问我的数据以进行验证。 所以我有了尝试与 iTunes (UIFileSharingEnabled) 共享数据的想法。 现在我可以在 iTunes 中看到我的数据库,我可以在我的 mac 上复制 .sqlite 文件,我可以使用 sqlite3 验证数据。

一切正常,但我想测试其他东西,所以我修改了我的应用程序中的一些数据,但我无法访问修改后的数据。 .sqlite 数据库总是有几天的历史。我在 iTunes 共享中有另外两个文件(.sqlite-shm 和 .sqlite-wal),它们已被修改(当我修改数据时日期会改变),但我无法“更新”.sqlite 文件。

我尝试在 iPhone 上强制退出应用程序,重建应用程序,创建新数据而不是修改,但没有成功。

我的应用程序中的数据是正确的,所以我假设修改存储在另外两个文件中,但是有人知道我可以尝试强制更新 .sqlite 文件吗?

【问题讨论】:

【参考方案1】:

根据Technical Q&A1809,强制SQLite将-wal文件合并到主.SQLite文件的方法是使用“回滚日志模式”将存储添加到持久存储协调器中:

对于使用 WAL 模式加载的 store,如果 main store 文件和对应的 -wal 文件都存在,则使用回滚日志模式将 store 添加到持久存储 coordinator 将强制 Core Data 执行检查点操作,将 -wal 文件中的数据合并到 store 文件中。这实际上是 Core Data 执行检查点操作的方式。

技术说明包括实现此目的的示例代码(尽管是目标 C)。

【讨论】:

谢谢!我不想更改程序(Apple 希望记录基础的方式)。现在我知道了进程的名称,我找到了适合我的操作link 将三个文件从 iTunes 放到一个文件夹中/为 .sqlite 文件/VACUUM 启动 sqlite3;/Ctrl-D/Relaunch sqlite3 用于sqlite 文件 -> 它是最新的【参考方案2】:

其他文件存在是因为存储使用 SQLite 日志类型。您只需在初始化 sqlite3 工具时使用该类型即可。

理想情况下,您应该只使用应用程序代码来查询数据存储,而不是使用 sqlite3,因为表结构应该被视为私有的。

【讨论】:

以上是关于如何强制更新 CoreData SQLite 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

coredata

RestKit 强制 CoreData 保存

提交新应用程序时如何更新我的 Database.sqlite

Coredata 性能——为只读数据集提供预填充的核心数据 sqlite db

如何使用 swift 在 iOS coredata sqlite 中启用 DELETE MODE

如何在objective-c的coredata应用程序中添加我的TwitterClient.sqlite中的数据