核心数据关系创建

Posted

技术标签:

【中文标题】核心数据关系创建【英文标题】:Coredata relationship creation 【发布时间】:2013-06-20 20:31:17 【问题描述】:

我有一个名为 EntityA 的实体,其中包含与另一个名为 EntityB 的实体(不是可选的,具有 1--1 关系)的关系,我希望当我创建 EntityA 时,会自动创建一个 EntityB 实例。

有可能吗?

我也在使用 CoreData 模型版本控制。在我的下一个版本中,我将这个新实体 (EntityB) 引入到 EntityA 中,问题是我无法保存对象 EntityA,因为之前没有创建 entityB。

是否有可能在 CoreData 合并期间(将在 DB 方案中添加 EntityB)创建这种新关系?

非常感谢您的帮助。

蒂埃里

【问题讨论】:

【参考方案1】:

要回答您的第一个问题,您可以通过添加逻辑来自动创建 EntityB,并在 EntityA 的 didAwakeFromInsert 方法中设置关系。

我认为您必须以类似方式处理第二个问题。您可以做的是向 EntityA 的 didAwakeFromFetch 方法添加逻辑,以检查与 EntityB 的关系是否存在,如果不存在则创建一个 EntityB。

【讨论】:

【参考方案2】:

正确的方法是在生成的 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/

【讨论】:

以上是关于核心数据关系创建的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在核心数据模型中自动创建反向关系?

创建核心数据反向关系

如何创建从一个实体到另一个现有实体的核心数据关系?

如何创建一个基于父关系过滤核心数据对象的 NSFetchRequest?

如何创建父实体和关系的核心数据模型

为核心数据手动创建多对多关系中的中间表