如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?
Posted
技术标签:
【中文标题】如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?【英文标题】:How to correctly configure CoreData datamodel and NSManagedObjects for a to-many relationship? 【发布时间】:2012-10-20 10:14:23 【问题描述】:如何正确配置 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]: unrecognized selector sent to instance 0x7450370”
当我打电话时
NSMutableSet *children = [parent mutableSetValueForKey:@"children"];
'NSManagedObjects of entity 'Parent' 不支持 -mutableSetValueForKey: for the property 'children''
此外,似乎没有生成任何生成的添加/删除方法来修改子集合,例如
- (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
【问题讨论】:
您是自己编写文件 Parent.m/h、Child.m/h 还是在 Xcode 中使用“Editor -> Create NSManagedObject Subclass...”生成文件?您是否仔细检查过 Core Data Inspector 中“孩子”是否被定义为“多对多关系”? 我在写父母/孩子方面有过几次尝试。我尝试从头开始生成和编写。我没有意识到 Core Data Inspector 有这些信息。这似乎已经成功了@MartinR。如果你想把它写成答案,我会接受它并在 cmets 中用我的详细信息进行注释。 【参考方案1】:您应该在 Xcode 中使用“Editor -> Create NSManagedObject Subclass...”来创建托管对象子类文件。这可确保您拥有正确的访问器功能。另一个优点是 Xcode 然后知道访问器函数并执行自动完成。
还要确保 children
关系在 Core Data Inspector 中定义为“多对多关系”。
【讨论】:
谢谢。在 Xcode 中设置多对多关系解决了这个问题。可以通过在 xcdatamodeld 文件中选择一个关系并单击最右侧的检查器来找到它。我之前只在单击实体(而不是关系)时查看了这个检查器。 这里是在 Xcode 中设置 To Many 关系的地方:***.com/questions/9933689/…【参考方案2】:现在使用 iPad,所以我的代码不方便。我上周刚做了这个,我所做的就是完全按照 Apple 的指令,使用 Core Data 编程指南 - 多对多指令接近尾声,并在目录中引用。
然后我使用 Xcode 创建对象模板,并使用生成的可变方法 Xcode 创建来添加对象。
如果您希望我发布我进行多对多关联的确切行,我稍后可以访问我的代码。
编辑:所以我在 Core Data 模型的图形视图中看到的是两个由两侧的双箭头连接的对象 - 这将告诉你它已正确连接。然后,在生成的代码中,我有一个 Xcode 为我生成的方法:
- (void)addProductsObject:(Product *)value;
在我的应用中,有包含产品的订单,正如您想象的那样,这是多对多的。它一切正常。当您建立关联时,您只需要执行一次(就像上面一样,我将产品添加到订单中,订单到产品的关联会自动发生。
【讨论】:
感谢您的回复。我应该使用 xcode 生成这些类,而不是从头开始编写它们。这听起来对我有帮助。但是,设置多对多关系直接修复了崩溃。以上是关于如何为一对多关系正确配置 Core Data 数据模型和 NSManagedObject?的主要内容,如果未能解决你的问题,请参考以下文章
如何为依赖于关系的自定义 Core Data 属性发布通知?