为什么我不能将NSSet保存到coredata中的“to-many”关系?

时间:2011-04-19 21:15:39

标签: iphone objective-c core-data

在我的一个核心数据实体中,我与另一个实体有一对多的关系。 说我的家庭实体与人有很多关系。

我可以创造家庭和人没有问题。但是当我做的时候:

self.myFamily.people = [NSSet setWithArray:myPersonArray];

似乎没有为“人”关系分配一组。 我目前正在将一些代码从视图控制器重新分解为一个单例。这有可能与它有关吗?我可以保存所有其他对象,我可以创建和删除托管对象我只是无法将一组对象分配给关系!

2 个答案:

答案 0 :(得分:1)

有几个原因导致这可能无效。首先,如果您尝试在对象的初始化程序中执行此操作,则无法正确设置该值。调用初始化程序时,该对象尚未添加到上下文中,因此设置值可能没有任何效果。其次,Apple建议不要直接设置多对多的关系(对不起,我找不到这个声明的文档,但它说的话,如果你做得太多,它可能会停止工作)。相反,您应该使用动态创建的访问器或使用从mutableSetValueForKey:返回的值来自动修改它自动创建的可变集。

[self.myFamily addPeople:[NSSet setWithArray:myPersonArray]];

[[self.myFamily mutableSetValueForKey:@"people"] addObjectsFromArray:myPersonArray];

或者,因为你想改变整个集合

[[self.myFamily mutableSetValueForKey:@"people"] setSet:[NSSet setWithArray:myPersonArray]];

您应该使用mutableSetValueForKey:而不是访问者返回的设置对象,因为访问者返回的对象不会调用KVC通知,但来自mutableSetValueForKey:的对象将会。

答案 1 :(得分:1)

报告此错误的最可能原因是尝试添加一组错误的对象类。您只能在数据模型中添加为关系定义的实体/类的对象。

所以,如果您有这样的数据模型:

Family{
    name:string
    people<-->>Person.family
}

Person{
    name:string
    family<<-->Family.people
}

...并且您拥有FamilyMOPersonMO的NSManagedObject子类,那么您只能将一组PersonMO个对象分配给Family.people关系。如果您尝试分配这样的集合:

NSSet *badSet=[NSSet setWithObjects:PersonMO1, PersonMO2, FamilyMO1, PersonMO2,nil];
aFamilyMO.people=badSet;

......它会失败和IIRC,它会默默地这样做。