如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?

Posted

技术标签:

【中文标题】如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?【英文标题】:How to NSKeyedUnarchive subclasses of NSManagedObject to import into Core Data? 【发布时间】:2011-01-23 20:22:15 【问题描述】:

使用NSKeyedArchiver/NSKeyedUnarchiver 保存和加载其数据的现有基于文档的应用程序当前已转换为使用Core Data 作为其存储后端。

现在我正在尝试导入使用以前的应用程序保存的文件。对象结构没有改变,但是我把所有对象都改成了NSManagedObjects。现在initWithCoder: 调用[super initWithCoder:] 并且不使用NSEntityDescription 创建对象。那失败了(正如预期的那样)。

我的问题是:拥有这种导入功能的最佳做法/好的建议是什么?

【问题讨论】:

在整理了我自己的解决方案后(涉及一些在桌面上的敲门声),我找到了 The Mental Faculty 描述的相同解决方案: 您应该将您的评论移至答案并接受它,以便其他人可以找到它。 【参考方案1】:

正确的方法是实现NSAtomicStore 的子类,将旧数据格式解压缩为Core Data 表示。使用该存储加载旧数据后,您可以使用-[NSPersistentStoreCoordinator migratePersistentStore:toURL:options:withType:NSSQLiteStoreType error:]轻松迁移数据

旧(错误)答案:

在整理了我自己的解决方案(涉及一些在桌面上敲打头)后,我找到了 The Mental Faculty 描述的相同解决方案:

KEYED-ARCHIVING TO CORE DATA MIGRATION

我的做法与他们相同,但我创建了自己的 NSKeyedValueDecoder 子类来存储上下文。我的CBManagedObject 超类对所有实体的initWithCoder: 如下所示:

- (id) initWithCoder:(NSCoder *)inCoder 
    NSManagedObjectContext *context = ((CBNSKeyedUnarchiverCoreData*)inCoder).context;
    self = [super initWithEntity:[NSEntityDescription entityForName:[[self class] entityName] 
                                             inManagedObjectContext:context] insertIntoManagedObjectContext:context];
    if (!self) return nil;
    return self;

每个实体通过类方法+entityName 给出其实体名称。

似乎是一个很好的解决方案,因为它现在效果很好。

【讨论】:

以上是关于如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 imageData 保存到 NSManagedObject 属性

如何将其他 NSManagedObjects 存储为 NSManagedObject 的属性

如何在不复制目标 NSManagedObject 的情况下将目标 NSManagedObject 添加到另一个具有反向多对多核心数据关系的对象?

如何将 NSManagedObject 的 NSKeyedUnarchive 子类导入核心数据?

如何更正错误“无法将 [NSManagedObject] 类型的值分配给 [String] 类型

如何使用 NSManagedObject 将 NSDictionary 保存到 CoreData?