2

如何为一对多关系正确配置 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”而终止应用程序,原因:“-[Child count]:无法识别的选择器发送到实例 0x7450370”

当我打电话

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

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

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

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

xcdatamodeld

实体


  • 关系:父
    目标:父
    逆:子


  • 关系:子
    目标:子
    逆:父

  • 配置(默认)
    实体:子
    类:子

    实体:父
    类:父

父母.h

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

父母.m

@implementation Parent
  @dynamic children;
@end

孩子.h

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

孩子.m

@implementation Child
  @dynamic parent;
@end
4

2 回答 2

3

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

还要确保该children关系在 Core Data Inspector 中定义为“多对多关系”。

于 2012-10-20T13:35:58.900 回答
0

现在使用 iPad,所以我的代码不方便。我上周刚做了这个,我所做的就是完全按照 Apple 的指令,使用 Core Data 编程指南——多对多指令接近尾声,并在目录中引用。

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

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

编辑:所以我在 Core Data 模型的图形视图中看到的是两个由两侧的双箭头连接的对象 - 这将告诉你它已正确连接。然后,在生成的代码中,我有一个 Xcode 为我生成的方法:

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

在我的应用程序中,有包含产品的订单,正如您想象的那样,这是多对多的。它一切正常。当你建立关联时,你只需要做一次(就像上面一样,我将一个产品添加到一个订单中,订单到产品的关联会自动发生。

于 2012-10-20T13:07:54.033 回答