我正在使用CoreData
在我的应用中管理我的离线存储空间。离线存储的数据以NSObject
中的可转换形式保存在自定义xcdatamodel
中。
我在应用中的当前版本( v1.0 )正在存储Navigation
类。
我需要重命名Navigation
类来对抗我的代码库的另一个目标中的一些名称空间问题。
在版本2.0中,应用程序崩溃,因为当我搜索CoreData
商店时NSKeyedUnarchiver
由于缺少Navigation
类而失败。
迁移当前CoreData
商店以解决此问题的最佳方法是什么?
我试过这样的事情:
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"OfflineStorage"];
request.fetchLimit = 1;
request.predicate = [NSPredicate predicateWithFormat:@"storageID = 1"];
NSError *error;
NSArray *result;
@try {
result = [context executeFetchRequest:request error:&error];
}
@catch (NSException *exception) {
if([exception.name isEqualToString:NSInvalidUnarchiveOperationException]) {
NSFetchRequest *deleteRequest = [request copy];
deleteRequest.resultType = NSManagedObjectIDResultType;
deleteRequest.includesPropertyValues = NO;
deleteRequest.propertiesToFetch = @[];
NSArray *deleteResult = [context executeFetchRequest:request error:&error];
if(deleteResult.count) {
[context performBlockAndWait:^{
[context deleteObject:deleteResult.firstObject];
[context save:nil];
}];
}
}
}
虽然我会很聪明地捕获异常并尝试仅获取ObjectID以删除商店中的损坏数据。但它不起作用......
答案 0 :(得分:1)
您是否在模型中添加了新版本,并重命名了该可转换类?
您是否尝试进行自己的迁移并为变换重命名变换器?
我自己也没有这样做。因为现在自动迁移对我来说足够了。
<强>更新强>
对不起,我误解了你的问题。
变形是由你自己的价值变换器改造的?如果是这样,您可以在NSKeyedUnarchiver
中使用此功能,使用新类替换旧名称:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/index.html#//apple_ref/occ/clm/NSKeyedUnarchiver/setClass:forClassName: