CoreData 反题

Posted

技术标签:

【中文标题】CoreData 反题【英文标题】:CoreData inverse question 【发布时间】:2011-09-23 21:20:45 【问题描述】:

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

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

而且你只需要做其中之一。

但是,如果我这样做:

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

关系似乎没有正确更新。

但是,这样做可以正常工作:

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

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

【问题讨论】:

【参考方案1】:

您的代码看起来有问题。您有一个方法addEmployee,但这种方法的通常命名约定是addEmployeesObject。它有一个尴尬的名称,因为您通常将这样的一对多关系的名称指定为“员工”。 Key-Value 编码知道如何更改属性名称的大小写,但不知道如何取消复数。

如果您正在调用 addEmployee 并且没有收到错误,则可能是您以非常规的方式执行了某些操作,或者您可能正在调用碰巧存在的一些不相关的方法。如果是后者,它可以解释你的问题。

我的第二个猜测是检查以确保在两个方向上都定义了逆。即Department应该有一个employees关系,它的逆应该指定为department。 Employee 应该有一个部门关系,并且它的逆应该被指定为雇员。我认为如果您在 XCode 中使用模型编辑器,如果您设置了一个,它会自动设置两个逆,但可能会无意中覆盖它,我想如果您在代码中定义您的数据模型,您可以做到。

否则,您所做的似乎应该有效。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于CoreData 反题的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 本地数据存储

CoreData与CloudKit同步时将图像保存到CoreData?

RestKit + CoreData:从CoreData缓存中排除某些对象

Coredata — 入门使用

认识CoreData—初识CoreData

Coredata 单表简单使用