0

假设我有一群人。每个人都可以有一个同伴(大多数时候都会有一个同伴)。这种陪伴负责与其他人建立友谊。一个人只能通过一种陪伴而成为友谊。

例如我们有John, Tom, Mary, Paul, Peter, Frank and Wil

彼得和汤姆友谊保罗和约翰,等等:

Peter - Tom         Paul - Mary         Wil - John            Frank -
 |_Paul              |_Wil         
 |_John              |_Peter
                     |_Tom

Mary并且Frank不被任何人交朋友。Frank没有同伴。

我设置了以下关系:

Person
Relationship       Destination    Inverse            Type       Delete Rule
companion          Person         companion          To One     Nullify
friendshippedBy    Person         friendships        To Many    Nullify       Count 2 Maximum
friendships        Person         friendshippedBy    To Many    Nullify

我可以找到谁是彼得的同伴,谁是彼得的朋友,谁是彼得的朋友,谁没有同伴,谁没有与任何人交朋友,谁没有被交朋友。这一切都很好,这是我所需要的一切,除了我需要自己处理一些数据完整性:我必须确保只要彼得是汤姆的同伴,彼得和汤姆的友谊是同一个人(friendships关系两者应该相同)。我必须将这些关系设置为:

peter.friendships = [NSSet setWithArray:@[paul, john]];
tom.friendships = peter.friendships; // need to preserve it as long as they're companions

我想避免每次friendships伴侣关系中的一个人的关系发生变化时都必须写最后一行。我想我可以在一个类别上写一个方便的方法(我仍然必须确保我调用那个方法而不是.friendships =直接调用或者我必须覆盖setFriendships),但我真正想要的是让 Core Data 照顾这种关系本身。

有没有办法让 Core Data 自动保留这种关系?

4

2 回答 2

1

您可以引入一个中间实体“Connection”来存储同伴和共同朋友,而不是为所有“同伴”复制“友谊”:

在此处输入图像描述

(并将“同伴”关系的最大值设置为 2)。

然后

  • person.companionConnection.friendships是特定的朋友person
  • person.companionConnection.companions是一个包含给定person和他的同伴的集合,
  • 不与任何人建立友谊的人是那些与person.friendshipConnection = nil.
于 2013-08-03T08:19:50.270 回答
0

不,没有“自动复制”功能。使用覆盖选项setFriendships。您也可以使用 KVO 来触发更新。另一种可能性是不复制关系,而是添加一个方法来创建两个人的关系并返回它(取决于您要使用关系内容的目的)。

于 2013-08-01T06:59:26.633 回答