将核心数据重命名为Transformable

时间:2015-07-20 12:10:35

标签: objective-c core-data core-data-migration nscoder nskeyedunarchiver

我正在使用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以删除商店中的损坏数据。但它不起作用......

1 个答案:

答案 0 :(得分:1)

您是否在模型中添加了新版本,并重命名了该可转换类?

您是否尝试进行自己的迁移并为变换重命名变换器?

以下是一些文档:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/Introduction.html#//apple_ref/doc/uid/TP40004399-CH1-SW1

我自己也没有这样做。因为现在自动迁移对我来说足够了。

<强>更新

对不起,我误解了你的问题。

变形是由你自己的价值变换器改造的?如果是这样,您可以在NSKeyedUnarchiver中使用此功能,使用新类替换旧名称:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/index.html#//apple_ref/occ/clm/NSKeyedUnarchiver/setClass:forClassName