使用与NSPredicate的多个关系访问值

时间:2011-05-03 20:56:15

标签: iphone core-data nspredicate

这是我的核心数据模型:

地点< --->>主题列表<< --->主题

entites具有以下属性:

位置
- 财产:姓名
- 关系:ThemesList

ThemesList
- 关系:地点
- 关系:主题

主题
- 财产:姓名
- 关系:地点

我正在运行实体位置的提取,我想只提取主题中的name属性等于特定值的值。根据我读过的内容,我需要做一个子查询。我已尝试过下面代码的内容,但我总是收到错误无法解析格式字符串

[NSString stringWithFormat:@"SUBQUERY(ThemesList, $theThemes, $theThemes.Themes.Name LIKE %@)", @"a theme name"];

关于如何实现这一点的任何想法 - 我做错了什么?

谢谢

2 个答案:

答案 0 :(得分:0)

你的问题是:$theThemes.Themes.Name。解析器将要将其解析为变量表达式(因为它以$开头),但当它遇到.时,它将产生错误。

事实证明,SUBQUERY是不必要的。同样的查询可以有效地完成:

NSPredicate *p = [NSPredicate predicateWithFormat:@"ANY ThemesList.Themes.Name LIKE %@", @"a theme name"];

希望Core Data比SUBQUERY更容易处理它。

答案 1 :(得分:0)

根据经验,您应该使用谓词获取正在测试的实体的对象,而不是从另一个实体开始并在谓词内部走一段关系。行走关系,特别是谓词内部的许多关系,计算密集且速度慢。

相反,我建议对Theme实体运行fetch,然后只询问返回的Theme对象的相关Locations对象。

你的谓词会简化为:

NSPredicate *p = [NSPredicate predicateWithFormat:@"Themes.Name LIKE %@", @"a theme name"];

然后使用集合运算符查找位置对象:

NSSet *locations=[fetchedThemes valueForKeyPath:@"@distinctUnionOfSets.locations"];