在WWDC 2013会议'207:Core Data中的新功能'中,他们提到您可以通过在添加持久存储时传递选项字典来启用SQLite WAL:
@{ NSSQLitePragmasOption: @"journal_mode = WAL" }
(可在iOS4 +上使用,将成为未来iOS版本的默认设置)。
我想知道在我的应用程序中为早期iOS版本启用这通常是一件好事。
我已经咨询了SQLite page about write ahead logging以及他们提到的缺点,其中大多数似乎不适用于iOS:
几乎所有优势听起来都像是iOS上的好处:
我很想(可能需要对我的应用程序进行一些检查,以确保它不会减慢速度),这对于启用是件好事,但是我应该注意或者任何已知的任何缺点问题
答案 0 :(得分:18)
http://pablin.org/2013/05/24/problems-with-core-data-migration-manager-and-journal-mode-wal/表明他们可能是迁移问题,尤其是:
使用迁移管理器时,Core Data将创建一个新数据库 为你,并开始从旧数据库逐个复制实体 新的。
由于我们使用的是journal_mode = WAL,还有一个额外的文件 DB.sqlite名为DB.sqlite-wal。
据我所知,问题似乎是Core Data创建了一个 临时DB,在那里插入所有内容,以及何时将其重命名为 原始名称,-wal文件保留为旧文件的剩余部分 版。问题是你最终得到了一个不一致的数据库。
(也在https://github.com/magicalpanda/MagicalRecord/issues/490上提到 - 这表明如果你使用魔法记录,那么它已经默认为WAL)
答案 1 :(得分:2)
关于涉及子类化NSMigrationManager的非轻量级迁移所发生的错误,我已将其作为错误16038419重新报告给Apple。
我还做了一个不同的method-swizzling workaround,在您总是想要使用旧版删除/回滚日记功能的情况下修补该错误。据我了解,Pablin's fix适用于您希望在迁移期间使用WAL 除之外的情况。此外,您可以在this video中看到错误。