核心数据父子实体

时间:2013-01-15 20:15:20

标签: ios objective-c core-data

核心数据模型中的父实体和子实体存在一个小问题。我的核心数据模型有一个Person实体,可以有许多链接到它的googleplus帐户或Twitter帐户。既然这两个实体; GooglePlus和Twitter在某种程度上与他们拥有的属性相似,我想到了创建一个名为SocialConnection的抽象实体。现在,我的Person实体与SocialConnection实体有很多关系,它实际上是GooglePlus和Twitter的父实体。

Person  <----->> SocialIdentifier ---- Child ---- GooglePlus
                     |
                     |
                   Child
                     |
                     |
                  Twitter

我的图形模型如下图所示。

enter image description here

现在,我有一个情况。 Person有一个名为socialConnections的属性,它将获取所有连接,无论它是Twitter对象还是GooglePlus对象。但是,我想有时候只提取Twitter和GooglePlus。我该怎么做。

我认为一个想法是从SocialIdentifier指向Person实体的后向关系,让Person与每个孩子建立前向关系。

它将表示为;

Person  <----------- SocialIdentifier -------- Child --------GooglePlus----->> Person
                              |
                              |
                            Child
                              |
                              |
          Person  <<------- Twitter

图形表示;                   enter image description here

但是,即使有了这种表述,我也面临着一些问题。我可以从Person模型获得谷歌和叽叽喳喳,但它没有提到SocialConnections即。所有的联系。 并且,我认为这是多余的,因为第一个简化了设计。我肯定对第一个产生一点调整会产生所需的一个,但我无法弄明白。

如何直接从第一个模型获取twitters或googles,或者是否可以从Person模型中获取所有连接而不使用谓词ofcourse。我相信这有一些非常巧妙的解决方案。 我想事先感谢你的帮助和建议。

1 个答案:

答案 0 :(得分:2)

我不会为此建立新的关系。您可以使用几种不同的方法。

获取属性

Person提供名为twitters的新获取属性。将目标实体设置为Twitter,将提取谓词设置为person==$FETCH_SOURCE。然后在需要时询问twitters的值。 (是的,你出于某种原因说没有谓词,但老实说,这是这个工作的正确工具。)

这里的优点是你不必保持新的关系。如果您将新的Twitter帐户添加到socialConnections,它会自动成为twitters的一部分。

过滤集合

如果没有大量的socialConnections,则可能更容易在代码中过滤它而不是让Core Data执行此操作。获取每个socialConnections对象并过滤该集合,例如:

NSEntityDescription *twitterEntity = [NSEntityDescription entityForName:@"Twitter" inManagedObjectContext:[self managedObjectContext]];

NSSet *twitters = [[person valueForKey:@"socialConnections"] objectsPassingTest:^BOOL(id obj, BOOL *stop) {
    return [[obj entity] isKindOfEntity:twitterEntity];
}];

这贯穿于每个社交关系,只获得Twitter帐户。