我在执行 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/