核心数据和iOS 7:持久性存储的不同行为

Fra*_*kZp 66 sqlite core-data ios uimanageddocument ios7

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

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

  • persistentStore
  • persistentStore-wal
  • persistentStore-shm

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

小智 96

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

NSDictionary *options = @{ NSSQLitePragmasOption : @{@"journal_mode" : @"DELETE"} };
Run Code Online (Sandbox Code Playgroud)

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

iOS CoreData - 启用sqlite WAL/Write-Ahead Logging有任何缺点

  • 这是推出此功能的可怕方式.Apple应该知道比自动启用此功能更好.现在要创建一个数据库备份,用户必须拥有这两个文件..我在ios7更新后从备份中恢复ios设备时只有数百个用户松散数据才发现WAL文件丢失所以所有数据因为移动到ios 7已经不见了......只需将设备升级到ios7就会改变所有应用程序存储数据的方式.谁认为这是一个很好的"默认" (5认同)
  • 嘿@Andy,你的代码中有轻微的拼写错误.它应该读@"journal_mode". (4认同)
  • 我们有一个应用程序,用户开始抱怨他们在更新到最新版本时丢失了数据,这是为iOS 7编译的.将日志模式更改回DELETE修复了我们的问题. (3认同)