Coredata关系创建

时间:2013-06-20 20:31:17

标签: ios core-data core-data-migration

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

有可能吗?

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

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

非常感谢你的帮助。

亨利

2 个答案:

答案 0 :(得分:0)

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

我认为你必须同样处理你的第二个问题。您可以做的是向EntityA的didAwakeFromFetch方法添加逻辑,以检查是否存在与EntityB的关系,并创建EntityB(如果它不存在)。

答案 1 :(得分:0)

执行此操作的正确方法是在生成的NSManagedObject子类中设置关系。我强烈建议您查看一个名为mogenerator(http://rentzsch.github.io/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/