有几个NSManagedObjects在Core Data中共享To-Many关系?

时间:2013-08-01 06:46:51

标签: iphone objective-c core-data magicalrecord

让我们说我有一群人。每个人都可以有一个伴侣(大部分时间都会有伴侣)。这种陪伴是负责帮助其他人的朋友。一个人只能通过一次友谊来友谊。

e.g。我们有John, Tom, Mary, Paul, Peter, Frank and Wil

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

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

MaryFrank并非任何人友好关系。 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),但是我和我#39; d真的很想让Core Data自己处理这种关系。

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

2 个答案:

答案 0 :(得分:1)

而不是复制"友谊"对于所有"同伴",你可以介绍一个 中间实体"连接"存储同伴和普通朋友:

enter image description here

(并设置"同伴的最大值"与2的关系)。

然后

  • person.companionConnection.friendships是给定person的朋友,
  • person.companionConnection.companions是一个包含给定person和他的person.friendshipConnection = nil的集合 伴侣,
  • 没有人友好的人是{{1}}。

答案 1 :(得分:0)

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