0

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 以删除我商店中的损坏数据。但它不起作用……</p>

4

1 回答 1

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

于 2015-07-20T13:11:32.530 回答