核心数据搜索2个关系

时间:2013-03-13 15:30:30

标签: ios objective-c core-data nspredicate

我有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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

然后你可以......

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

然后状态将是人“拥有”的一组唯一状态。

随着这些变化的多次发生。

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

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

......我认为这可行吗?

答案 1 :(得分:2)

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

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