如何将NSKeyedUnarchive NSManagedObject的子类导入Core Data?

时间:2011-01-23 20:22:15

标签: cocoa core-data import nsmanagedobject

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

现在我想尝试使用以前的应用程序保存一些文件。对象结构没有改变,但我将所有对象都改为NSManagedObject s。现在initWithCoder:调用[super initWithCoder:]并且不使用NSEntityDescription创建对象。这种情况很糟糕(如预期的那样)。

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

1 个答案:

答案 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为其实体名称。

似乎是一个很好的解决方案,因为它现在非常好用。