Cocoa-Touch – 更新多对多关系的核心数据

Posted

技术标签:

【中文标题】Cocoa-Touch – 更新多对多关系的核心数据【英文标题】:Cocoa-Touch – Core Data updating many-to-many relationships 【发布时间】:2012-01-30 12:20:23 【问题描述】:

我有两个实体,一个叫Group,另一个叫Contact。他们有一个多对多的关系(至少一个)。因此,至少一个联系人可以属于一个或多个组,并且至少一个组可以属于一个或多个联系人。

Contact <<-->> Group

现在,当我想更新一个组时,我的视图控制器中有我的子类 NSManagedObject Group 可用。 (@property (nonatomic, strong) Group *selectedGroup;)

假设组最初与 3 个联系人有关系,在我更新该组后,它应该有 2 个联系人(1 个原始联系人和 1 个新联系人)。

Before update    After Update
Group            Group
-----            -----
ContactA         ContactA
ContactB         ContactD
ContactC

ContactA 应该保持不变。

这意味着应该从组中删除ContactB 关系(也应该从联系人实体中删除,因为没有其他组与ContactB 有关系)

ContactC 应该被创建。

我将如何处理这种情况?我无法让它工作。

【问题讨论】:

【参考方案1】:

您是否为核心数据模型生成模型类?如果是这样,您应该在 Group 类中创建如下所示的 CoreDataGeneratedAccessors:

- (void)addContactObject:(Contact *)value;
- (void)removeContactObject:(Contact *)value;

然后您可以执行以下操作:

Group *group = ...
Contact *contactB = ...
Contact *contactC = ...
Contact *contactD = ...
[group addContactObject:contactD];
[group removeContactObject:contactB];
[group removeContactObject:contactC];
//save your context

【讨论】:

是的,我已经生成了模型类。所以我看到您的代码正在编辑特定组,但我没有看到与从联系人实体中完全删除 ContactB 相关的任何内容? 鉴于它是多对多,我不知道您想完全删除该联系人(考虑到其他组可能与它相关)。只需从 managedobjectcontext 中删除该对象即可。

以上是关于Cocoa-Touch – 更新多对多关系的核心数据的主要内容,如果未能解决你的问题,请参考以下文章

预加载具有多对多关系的核心数据的最佳实践

多对多关系实体框架核心db优先

核心数据多对多关系的正确删除规则?

具有多对多关系的核心数据 NSPredicate

核心数据。加入 2 个具有多对多关系的表?

为核心数据手动创建多对多关系中的中间表