【问题标题】:Core Data and iOS 7: Different behavior of persistent storeCore Data 和 iOS 7:持久存储的不同行为
【发布时间】:2013-09-23 02:29:42
【问题描述】:

我正在准备更新基于 Core Data 的应用程序以修复 iOS 7。我使用 Xcode 5 和 iOS 7 SDK GM。但是我意识到持久存储的不同行为(即UIManagedDocument):在 iOS 7 构建之前,documents 文件夹中只有一个文件persistentStore(有时还有第二个文件persistentStore-journal)。

在 iOS 7 构建(全新安装)中,持久存储现在有三个文件:

  • persistentStore
  • persistentStore-wal
  • persistentStore-shm

Apple 现在是否将日志模式默认更改为 WAL?我想知道是否对我的应用程序有影响(想想用户如何从上一个版本更新)?最好禁用 WAL - 如果是这样,我如何使用 iOS 7/UIManagedDocument 执行此操作?

【问题讨论】:

  • 不妨看看 WWDC 2013 的“Core Data 和 iCloud 的新功能”会议。您可以从 developer.apple.com/wwdc/videos 下载 PDF 文件。 Apple 将 SQLite 文件的默认日志模式从“回滚”更改为“预写日志”。

标签: ios sqlite core-data ios7 uimanageddocument


【解决方案1】:

是的,Apple 已将 iOS7 的默认日志模式更改为 WAL。 您可以通过在调用 addPersistentStoreWithType:configuration:url:options:error 时将 NSSQLitePragmasOption 添加到选项来指定日志模式。例如。设置以前的默认删除模式:

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };

根据我的经验,WAL 提供了更好的性能,但也请参阅这篇文章:

iOS CoreData - are there any disadvantages to enabling sqlite WAL / Write-Ahead Logging

【讨论】:

  • 嘿@Andy,您的代码中有轻微的拼写错误。它应该是@"journal_mode"。
  • @ajmccall 我处理了journal_mode 中的拼写错误,请查看sqlite.org/pragma.html 了解所有选项。
  • 我们有一个应用程序,当他们更新到最新版本时,用户开始抱怨他们丢失了数据,该版本是为 iOS 7 编译的。将日志模式改回 DELETE 解决了我们的问题。
  • 这是推出此功能的一种可怕方式。苹果应该比自动启用此功能更清楚。现在要创建数据库的备份,用户必须同时拥有这两个文件。当他们在 ios7 更新后从备份中恢复他们的 ios 设备时,我有数百个用户松散数据,只是发现 WAL 文件丢失了,所以所有数据因为迁移到 ios 7 已经不复存在了……只需将设备升级到 ios7 就会改变所有应用程序存储数据的方式。谁认为这是一个很好的“默认”
  • 将我添加到也没有提前注意到此问题的烧毁开发者列表中。 DELETE 选项也对我有用。
猜你喜欢
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
  • 2011-01-15
  • 1970-01-01
  • 2020-02-01
  • 1970-01-01
相关资源
最近更新 更多