如何将 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 作为其存储后端。
现在我正在尝试导入使用以前的应用程序保存的文件。对象结构没有改变,但是我把所有对象都改成了NSManagedObject
s。现在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 子类导入核心数据?