正确的方法是在生成的 NSManagedObject 子类中设置关系。我强烈建议您查看一个名为 mogenerator ( http://rentzsch.github.io/mogenerator/ ) 的工具,因为它可以让您不断更改您的核心数据模型,而不会丢失您添加到的所有自定义代码核心数据实体子类。Mogenerator 可以设置为在您更改模型时自动生成新的子类,而不会破坏您为处理核心数据实体而编写的自定义代码。如果您打算认真使用核心数据,那么花时间学习它是非常值得的。
要手动生成这些文件(无需 mogenerator),您只需在 XCode 中单击核心数据模型文件,选择要为其创建子类的实体,单击“编辑器”菜单并选择“创建 NSManagedObject 子类...”
这将创建两个文件,EntityA.h 和 EntityA.m(或 EntityB,具体取决于您在单击菜单项时选择的实体)。为其他实体再次执行相同的过程以生成其文件(注意:确保在生成这些文件之前已设置好关系,否则您将不得不重新生成它们!)。
然后我通常会创建这样的类方法:
//In EntityA.h
//between @interface and @end...
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context;
//In EntityA.m
+ (EntityA*)createNewEntityAInContext:(NSManagedObjectContext*)context
{
EntityA* aEntityAObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityA" inManagedObjectContext:context]
EntityB* aEntityBObject = [EntityB createNewEntityBInContext:context];
aEntityAObject.entityBLink = aEntityBObject;
return aEntityAObject;
}
//In EntityB.h
//between @interface and @end...
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context;
//In EntityB.m
+ (EntityB*)createNewEntityBInContext:(NSManagedObjectContext*)context
{
EntityB* aEntityBObject = [NSEntityDescription insertNewObjectForEntityForName:@"EntityB" inManagedObjectContext:context]
return aEntityBObject;
}
然后,您可以在需要新对象时调用您的 +createNewEntityAInContext: 方法,并且将自动创建关系。
关于您的其他问题,您正在寻找的称为自定义核心数据迁移策略。您可以在 google 中搜索有关该主题的教程,并且有很多链接。这是我发现乍一看还不错的一个:http: //9elements.com/io/index.php/customizing-core-data-migrations/