我编写了一个通过 Core Data 搅动大量数据的应用程序。用户在后台退出应用程序后,我会清理这些数据。由于 WAL 检查点似乎是导致 UI 暂停的主要原因,因此我还想强制使用 WAL 检查点。 (是的,我知道创建第二个核心数据堆栈。这也将完成,但这个问题仍然存在。我已经使用第二个堆栈进行了现有的实验,但它们尚未带来任何明显的优势。)谷歌揭示了下一页,新的默认日记模式 https://developer.apple.com/library/mac/qa/qa1809/_index.html,其中对如何在将数据库复制到其他地方之前强制设置数据库检查点进行了非常温和的讨论。我的问题是我想在实时数据库上强制检查点而不破坏我的整个用户界面。我将持久存储重新添加到协调器的实验没有成功。它们会导致无限循环。
显然,检查点可以在不影响我现有的 MOC 和 PSC 的情况下完成,因为它已经发生了。我只是想在一个众所周知的时间强制执行它,而不会影响我的用户的幸福感。
该文档的描述可能很温和,但它就是这样做的。 Core Data 并不是真正的 SQLite 包装器,它提供对 SQLite 的直接访问非常有限。添加持久存储时传递选项是唯一的选择。
简而言之:您不能在实时持久存储上强制设置检查点。
您可以做的是始终使用该方法,始终更改为回滚日志模式,而不是仅用于检查点目的。通过使用journal_mode
选项,您可以将 SQLite 切换到不需要检查点的不同模式。只要你包括
NSDictionary *options = @{NSSQLitePragmasOption:@{@"journal_mode":@"DELETE"}};
添加商店时就不存在这个问题了。
如果你想保留wal
模式下,您可以尝试使用选项列表中的其他 SQLite 编译指示来调整检查点行为。例如,wal_autocheckpoint
pragma 调整检查点出现的频率。通过调整,您也许可以获得更好的结果。您仍然无法按需调用检查点,但您将改变性能。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)