如何正确配置Core Data数据模型和NSManagedObjects以实现多对多关系?

时间:2012-10-20 10:14:23

标签: ios core-data nsmanagedobject

如何为多对多关系正确配置CoreData数据模型和NSManagedObjects? 我觉得我错误配置了xcdatamodeld文件,但我找不到有什么问题。 我选择了CoreData生成了一个新的单一视图项目。以下代码很简单,因为我可以解释这个问题。

Parent *parent = [NSEntityDescription insertNewObjectForEntityForName:@"Parent"      inManagedObjectContext:[self managedObjectContext]];

Child *child = [NSEntityDescription insertNewObjectForEntityForName:@"Child" inManagedObjectContext:[self managedObjectContext]];    

child.parent = parent;

当我打电话

[parent.children count];

由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:' - [子计数]:无法识别的选择器发送到实例0x7450370'

当我打电话

NSMutableSet *children = [parent mutableSetValueForKey:@"children"];

'实体'父'的NSManagedObjects不支持-mutableSetValueForKey:属性'children''

此外,似乎没有生成任何生成的添加/删除方法来修改子集合,例如

- (void)addChildObject:(Child *)value;
- (void)removeChildObject:(Child *)value;

xcdatamodeld

实体

  • 儿童
    关系:父母 目的地:父母 逆:孩子


  • 关系:孩子们 目的地:孩子
    逆:父

  • 配置(默认)
    实体:孩子
    class:Child

    实体:父母 class:Parent

Parent.h

@interface Parent : NSManagedObject
  @property (nonatomic, retain) NSSet *children;
@end

Parent.m

@implementation Parent
  @dynamic children;
@end

Child.h

@interface Child : NSManagedObject
  @property (nonatomic, retain) NSManagedObject *parent;
@end

Child.m

@implementation Child
  @dynamic parent;
@end

2 个答案:

答案 0 :(得分:3)

您应该在Xcode中使用“Editor - > Create NSManagedObject Subclass ...”来创建托管对象子类文件。这可确保您拥有正确的访问器功能。另一个优点是Xcode然后知道访问器功能并执行自动完成。

确保核心数据检查器中children关系被定义为“To-Many Relationship”。

答案 1 :(得分:0)

现在使用iPad,所以我的代码不方便。我上周刚刚做了这个,我所做的就是遵循Apples指令,使用核心数据编程指南 - 多对多指令接近结束并在目录中引用。

然后我使用Xcode创建对象模板,并使用生成的Xcode创建的可变方法来添加对象。

如果您希望我发布与多对多关联的确切行,我稍后可以访问我的代码。

编辑:所以我在核心数据模型的图表视图中看到的是两个双边箭头连接的两个对象 - 这将告诉您正确连线。然后,在生成的代码中,我有一个Xcode为我生成的方法:

- (void)addProductsObject:(Product *)value;

在我的应用程序中,有订单包含产品,这是您想象的多对多。一切正常。当您建立关联时,您只需要执行一次(如上所述,我将一个产品添加到订单中,并且订单到产品关联会自动发生。