这是我的核心数据模型:
地点< --->>主题列表<< --->主题
entites具有以下属性:
位置
- 财产:姓名
- 关系:ThemesList
ThemesList
- 关系:地点
- 关系:主题
主题
- 财产:姓名
- 关系:地点
我正在运行实体位置的提取,我想只提取主题中的name属性等于特定值的值。根据我读过的内容,我需要做一个子查询。我已尝试过下面代码的内容,但我总是收到错误无法解析格式字符串
[NSString stringWithFormat:@"SUBQUERY(ThemesList, $theThemes, $theThemes.Themes.Name LIKE %@)", @"a theme name"];
关于如何实现这一点的任何想法 - 我做错了什么?
谢谢
答案 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"];