【问题标题】:Renamed Core Data Transformable重命名核心数据可转换
【发布时间】:2015-07-20 12:10:34
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

    您是否尝试进行自己的迁移并将转换器重命名为可转换对象?

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

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

    更新

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

    transformable 是由你自己的值转换器转换的?如果是这样,您可以在 NSKeyedUnarchiver 中使用它来用新类替换具有旧名称的类:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSKeyedUnarchiver_Class/index.html#//apple_ref/occ/clm/NSKeyedUnarchiver/setClass:forClassName

    【讨论】:

    • 我添加了一个新的模型版本。但我认为主要问题是可转换类本身在 coredata 之外发生了变化。没有迁移过程,因为核心数据认为到目前为止一切都是安全的。仅在获取属性后才失败:(
    • 但是您在 Core Data 中设置了可转换的名称,然后为该名称注册了该类。我想知道为什么类名是相关的。
    • 我没有为可转换对象注册类名。我只是把它放在那里,其余的通过 NSKeyedArchiver 完成
    • 对不起,马吕斯。我忘了请求更新通知。所以我错过了你的答案。
    • 我明白了,我完全误解了你的问题。哎呀!
    猜你喜欢
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    • 2018-11-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多