基本上,我有2个实体,其中一个我添加一个属性,另一个,我将属性类型从NSString更改为NSArray(可转换).
到目前为止,它非常好,运行良好,在迁移后进行了测试并且数据完整性完好无损.
如果我在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) 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,0x0)’
AFAIK,难以理解的存档意味着CoreData上的数据损坏.
很难理解的是,之前的代码完全相同,因此,如果它是一个逻辑问题,它应该发生在Xcode 4.5上.我找了CoreData Diffs,但没找到任何相关的东西.
如果有人知道可能是什么问题,我将不胜感激.
谢谢.
解决方法
问题是我没有使用核心数据移动-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