iOS 7 - 核心数据迁移 - Xcode 5

标签 ios iphone objective-c xcode core-data

我在执行 CoreData 迁移时遇到了一个非常奇怪的问题。

基本上,我有 2 个实体,我在其中一个实体中添加了一个属性,在另一个实体中,我将属性类型从 NSString 更改为 NSArray(Transformable)。 到目前为止,非常好,运行良好,进行了测试,迁移后数据完整性完好无损。

如果我在 Xcode 5 上运行完全相同的代码(我不知道它是否与 iOS SDK 7.0 或 Xcode 5 相关),就会出现问题,但是迁移会运行并损坏数据。

我最终创建了一个简单的项目来演示正在发生的事情。 https://dl.dropboxusercontent.com/u/1393279/CoreDataMigration.zip

重现的步骤是: - 在 Xcode 5 (iOS SDK 7.0) 上,您可以使用模拟器 -

1 - 打开项目“BeforeMigration”并执行。查看创建的日志和数据,目前没有问题;

2 - 停止项目;

3 - 打开项目“AfterMigration”,构建并运行。

4 - 看到迁移已执行,但数据已损坏:

2013-11-13 12:22:29.778 CoreDataMigration[7223:70b] CoreData: error: exception during fetchRowForObjectID: * -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x43, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0) with userInfo of (null) 2013-11-13 12:22:29.782 CoreDataMigration[7223:70b] Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '** -[NSKeyedUnarchiver initForReadingWithData:]: incomprehensible archive (0x43, 0x32, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0)'

据我所知,无法理解的存档意味着 CoreData 上的数据已损坏。

令人难以理解的是,完全相同的代码之前可以正常工作,因此,如果这是一个逻辑问题,它应该发生在 Xcode 4.5 上。我查找了 CoreData Diffs,但没有找到任何相关信息。

如果有人知道可能是什么问题,我将不胜感激。 谢谢。

最佳答案

在 iOS 7 中,Core Data SQLite 存储的默认日志记录模式已更改为预写日志记录 (WAL),以提高可靠性、性能和并发性。

问题是我没有移动包含核心数据的 -wal 文件。修复它的一种方法是使用以下方法删除 -wal:

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

或者移动 -wal :

- (NSPersistentStore *)migratePersistentStore:(NSPersistentStore *)store toURL:(NSURL *)URL options:(NSDictionary *)options withType:(NSString *)storeType error:(NSError **)error

关于iOS 7 - 核心数据迁移 - Xcode 5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19960181/

相关文章:

html - 将 HTML 添加到 iOS 我得到预期的 '[' 错误

ios - Xcode 界面生成器没有给我选择在哪里放置 UITableViewCell 的重用标识符

ios - UITableView 混合部分项目

iphone - 如何在谓词是方法的情况下执行 NSArray filteredArrayUsingPredicate?

ios - 离开 UIViewController 时应用程序崩溃

iphone - 显示相机胶卷等选项的 View 的名称是什么?

iphone - 如何使用Three20框架实现隐藏状态栏

iphone - 从本地加载的文件缓存 UIWebview

objective-c - iOS 12.0 替代使用已弃用的 archiveRootObject :toFile:

ios - UITableView 有单元格,但不显示单元格