0

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

有可能吗?

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

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

非常感谢你的帮助。

蒂埃里

4

2 回答 2

0

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

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

于 2013-06-20T20:37:31.877 回答
0

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

于 2013-06-20T21:42:56.137 回答