1

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

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

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

在此处输入图像描述

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

我认为一个想法是从 SocialIdentifier 指向 Person 实体的反向关系,并让 Person 创建与每个孩子的正向关系。

它将表示为;

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

图示; 在此处输入图像描述

但是,即使有这种表示,我也面临一些问题。我可以从 Person 模型中获取 google 和 twitter,但它没有引用 SocialConnections 即。所有的连接。而且,我觉得这是多余的,因为第一个简化了设计。我确信对第一个进行一些调整会产生所需的结果,但我无法弄清楚。

我如何直接从第一个模型中获取推特或谷歌,或者是否可以在不使用谓词的情况下从 Person 模型中获取所有连接。我相信有一些非常巧妙的解决方案。我要提前感谢您的帮助和建议。

4

1 回答 1

3

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

获取的属性

给出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 帐户。

于 2013-01-15T23:38:21.910 回答