2011-04-19 51 views
2

在我的一个核心数据实体中,我与另一个实体有一对多的关系。 说我的家人实体与人有多对多的关系。为什么我无法将NSSet保存为coredata中的“一对多”关系?

我可以创建家庭和个人没有问题。但当我做一个:

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

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

回答

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,它会这样做的默默。

+0

我明白了。在将代码移动到单身人士中间时,我以错误的顺序调用方法,所以当我调用函数将人员添加到我的家人时,家庭还没有分配。这也是为什么其他一切都起作用 - 在家庭被添加到上下文之后,我正在调用其他方法。本来会期望有一个运行时错误,但是再次,我分配给零...这是完美的 - 德哦!我会给你留下沉默错误的印记;) – dantastic 2011-04-20 15:28:42

1

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

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

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

,或者因为你想改变整个设置

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

您应该使用mutableSetValueForKey:而不是由访问返回的集合对象,因为对象通过返回访问者不会调用KVC通知,但mutableSetValueForKey:中的对象将会。

+0

我不理解为什么,但这也不起作用。因此,我有@property(非原子,保留)NSSet *人员的班'家庭'但是我不能设置Set(它仍然是空的)。模板kas给我提供了如下方法: - (void)addPeople:(NSSet *)value {methods。但是使用它们似乎也不能填充集合。我是否需要初始化我的可能关系或发生了什么?或者在设定Set之后,我需要做其他事情吗?不应该?我正在保存上下文,但家族managedObject已经在那里,因此应该可以使用了。 – dantastic 2011-04-20 07:18:35

相关问题