使用 MagicalRecord 预填充数据库 (swift)。 -wal 日志创建,但是,数据未复制到数据库

Posted

技术标签:

【中文标题】使用 MagicalRecord 预填充数据库 (swift)。 -wal 日志创建,但是,数据未复制到数据库【英文标题】:Using MagicalRecord to prepopulate a database (swift). -wal journal created, however, data not copied to database 【发布时间】:2014-10-21 23:59:04 【问题描述】:

(原谅我不习惯在这里发帖。会尽力而为)

我正在开发一个将使用预填充数据库的 ios 应用程序。在我的工作区中,我有一个 iOS 应用项目和一个单独的命令行工具项目来填充数据库。我已将数据库文件从“/Library/Application Support”文件夹拖到我的 iOS 项目中(不使用“如果需要则复制项目”)。因此,当数据发生变化或需要额外数据时,我可以只运行命令行工具来预填充数据。从那里我将从模拟器中删除应用程序并进行清理。当我运行应用程序时,我会认为一切都会好起来的。

这让我疯了很长时间,但有时,在我删除应用程序、清理项目然后运行后,我看不到变化。似乎我可以让它工作的唯一方法是,在我运行命令行工具预填充数据库之后,我必须使用 Base、SQLiteStudio 或 Firefox 的 sqlite 插件打开数据库文件。一旦我这样做,它似乎工作。

当我查看 finder 时,我确实看到了文件 .sqlite、sqlite-shm 和 sqlite-wal。在打开数据库文件之前,我看到 wal 文件是最大的(现在是 2mb)。例如,一旦我使用 Base 打开文件,然后关闭它,sqlite 文件现在是 2mb。

当命令行即将完成时,我尝试在文件(vacuum、wal-checkpoint)上运行 PRAGMA 语句,但这些语句不起作用。我在这里想念什么。我也尝试使用 NSManagedObjectContext.MR_defaultContext.saveToPersistentStoreAndWait

我正在使用以下代码进行设置和保存。

MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("callithome.sqlite")

MagicalRecord.saveUsingCurrentThreadContextWithBlockAndWait((context)->Void in
                    println("Data saved, I hope"))
MagicalRecord.cleanUp()

任何帮助将不胜感激

【问题讨论】:

【参考方案1】:

您需要为您的 sqlite 商店启用 DELETE pragma 模式。这不会创建 -wal 和 -shm 文件。这将使您更容易在预填充的数据存储中使用单个文件。如果您想走这条路,您将需要使用具有一些额外功能的 MagicalRecord 3.0 来为您的商店添加自定义选项。但是,您仍然可以将存储添加到协调器并使用正确的 pragma 选项配置该存储。也就是说,如果你使用普通的 Core Data,就不需要 MagicalRecord。

【讨论】:

谢谢。是否有 Magical Record 3.0 的入门教程或一些文档? (例如,使用核心数据并尝试启用“删除”杂注。

以上是关于使用 MagicalRecord 预填充数据库 (swift)。 -wal 日志创建,但是,数据未复制到数据库的主要内容,如果未能解决你的问题,请参考以下文章

MagicalRecord 并不总是保存更改

使用 MagicalRecord 保存实体 - 还尝试保存不同的实体?

使用夹具或脚本预填充数据库?

使用方法预填充核心数据

带有预填充数据库的房间

initialValues仅在硬编码时预填充数据,但不在动态数据中预填充数据