使用NSKeyedArchiver
/ NSKeyedUnarchiver
保存和加载数据的现有基于文档的应用程序目前已转换为使用Core Data作为其存储后端。
现在我想尝试使用以前的应用程序保存一些文件。对象结构没有改变,但我将所有对象都改为NSManagedObject
s。现在initWithCoder:
调用[super initWithCoder:]
并且不使用NSEntityDescription
创建对象。这种情况很糟糕(如预期的那样)。
我的问题是:拥有这种导入功能的最佳做法/好建议是什么?
答案 0 :(得分:0)
正确的方法是实现NSAtomicStore
的子类,将旧数据格式解压缩为核心数据表示。使用该商店加载旧数据后,您可以使用-[NSPersistentStoreCoordinator migratePersistentStore:toURL:options:withType:NSSQLiteStoreType error:]
OLD(WRONG)ANSWER:
在将我自己的解决方案拼凑起来之后(涉及到一些撞击的问题)我找到了由心理学院描述的相同解决方案:
KEYED-ARCHIVING TO CORE DATA MIGRATION
我以与他们相同的方式做到了,但是我创建了自己的NSKeyedValueDecoder
子类来存储上下文。所有实体的initWithCoder:
超类的CBManagedObject
如下所示:
- (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
为其实体名称。
似乎是一个很好的解决方案,因为它现在非常好用。