CoreData反问题

时间:2011-09-23 21:20:46

标签: objective-c cocoa core-data nsmanagedobject nsmanagedobjectcontext

我对CoreData中的反向关系的理解是这两个语句应该是等价的:

[department addEmployee:employee];
[employee setDepartment:department];

并且你只需要做其中一个。

但是,如果我这样做:

[department addEmployee:employee];
NSLog(@"%@",[employee department]);

关系没有正确更新。

然而,这样做,工作正常:

[employee setDepartment:department];
NSLog(@"%@",[employee department]);

我也尝试在NSLog之前的上下文中调用“processPendingChanges”,但它没有什么区别

2 个答案:

答案 0 :(得分:1)

您的代码看起来有些不对劲。您有一个方法addEmployee,但这种方法的通常命名约定是addEmployeesObject。它有一个尴尬的名称,因为你通常指定一个多对多关系的名称,如“雇员”。键值编码知道如何更改属性名称的大小写,但它不知道如何对其进行非集成化。

如果您正在调用addEmployee并且没有收到错误,要么您以非常规的方式做了某件事,要么您可能正在调用一些恰好存在的无关方法。如果是后者,它可以解释你的问题。

我的第二个猜测是检查以确保您的逆向在两个方向上定义。也就是说,部门应该有员工关系,其反向应该指定为部门。员工应该有部门关系,其反向应指定为员工。我想如果你在XCode中使用模型编辑器,它会自动设置两个反转,如果你设置一个,但是可能会无意中覆盖它,我想如果你用代码定义数据模型就可以做到。

否则看起来你正在做的事情应该有用。

答案 1 :(得分:1)

检查NSManagedObject子类(代表Core Data模型中的类的类),这些子类与数据模型中的关系相匹配。例如,如果在已经生成/编码Employee和Department NSManagedObject子类之后向模型添加了关系,那么这些子类将过时并且不会反映您的模型。