通过 2 个关系搜索核心数据

Posted

技术标签:

【中文标题】通过 2 个关系搜索核心数据【英文标题】:Core data search through 2 relationships 【发布时间】:2013-03-13 15:30:30 【问题描述】:

我有 3 个实体:Person、Region 和 Boundary。边界具有“状态”属性。一个人可以有很多区域。一个区域可以有很多边界:

Person <<-->> Region <<-->> Boundary.state

对于 Person 实体,我想找出他有边界的所有状态。谓词可以进行这种搜索还是我需要进行嵌套搜索:

NSMutableArray *states = [NSMutableArray array];

for (Region *region in person.regions) 
    for (Boundary *boundary in region.boundaries) 
        // add state to array
    

编辑:

对不起,我不是数据库人,没想到他们是多对多关系:

Person<<-->>Region<<-->>Boundary

【问题讨论】:

有没有一个实体叫状态?您将能够使用谓词来获取一个人拥有的所有边界。从那里你可以计算出状态。 不,状态没有实体,只是边界实体中的一个属性。这可以解决吗?创建一个国家实体?它只会包含 1 个属性... 不,我会[回答。 @Fogmeister:我认为您的解决方案也会奏效。如果thePerson.regions 是一个大集合,它可能会不太有效。 - 不幸的是,问题的第一个版本具有误导性。 【参考方案1】:

谓词中的“ANY”集合运算符不适用于嵌套的一对多关系。您可以在此处使用 SUBQUERY:

[NSPredicate predicateWithFormat:@"SUBQUERY(regions, $r, ANY $r.persons == %@).@count > 0", thePerson]];

【讨论】:

是的,做到了!现在我要去一个角落,试着弄清楚它是如何工作的。谢谢!【参考方案2】:

要获取Person 拥有的所有Boundary 实体,您可以像这样使用NSFetchRequest...

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Boundary"];

[request setPredicate:[NSPredicate predicateWithFormat:@"region.person = %@", thePerson]];

这将返回一个 Boundary 实体数组,其 Person 是您放入谓词中的那个。

那你就可以了……

NSSet *states = [NSSet setWithArray:[results valueForKey:@"state"]];

那么 states 将是 Person“拥有”的一组唯一状态。

随着多对多这种变化。

你可以为谓词做一些类似的事情......

[NSPredicate predicateWithFormat:@"ANY region IN %@", thePerson.regions];

...我认为这可能有效?

【讨论】:

(你更快,我已经放弃了我的答案:-) - 最后一步可以简化为NSArray *states = [results valueForKey:@"state"] 哈!现在看起来有点简单明了,谢谢!而且我想我应该提到边界可以有很多人。所以谓词将是@"Any region.person == %@", thePerson,对吧? @Log139:如果只有personregion 关系之一是一对多关系,那么这应该可以工作。如果两者都是多对多,则需要更复杂的谓词。 是的,它的多对多关系。一个Person可以有很多Region,一个Region可以有很多Person。一个 Region 可以有多个 Boundary,一个 Boundary 可以有多个 Region。 那你就卡住了。在这种情况下,您需要一个子谓词。您还需要更改问题中的图表,因为它不正确且具有误导性。

以上是关于通过 2 个关系搜索核心数据的主要内容,如果未能解决你的问题,请参考以下文章

搜索引擎基础及核心思想

如何在核心数据中检索实体的唯一关系

easyui几个简单的应用(转)

Elasticsearch的倒排索引是什么?

IOS:通过一对多关系获取核心数据

核心数据需要时间来插入具有获取实体的记录并设置为关系