Ios 复合谓词

Ios 复合谓词,ios,core-data,nspredicate,Ios,Core Data,Nspredicate,我正在写一个有照片数据库的应用程序。每个照片都有几个与之关联的标签,应用程序有一个带有许多切换的搜索页面,允许用户仅基于他们感兴趣的标签搜索照片。这些标记中的每一个都存储了整数ID,因为它们对应于外部数据库的ID,所以我试图简单地按ID查找它们。所有ID字段都被索引 当我正在编写的谓词变得相当大时,问题就出现了,因为用户可以从许多不同的标记中进行筛选。这些标签分为3个类别[出版物、品牌和产品],因此我的查询设置为在一个类别中使用“或”,在这些类别中使用“和” 示例查询谓词的结果如下所示: (pa

我正在写一个有照片数据库的应用程序。每个照片都有几个与之关联的标签,应用程序有一个带有许多切换的搜索页面,允许用户仅基于他们感兴趣的标签搜索照片。这些标记中的每一个都存储了整数ID,因为它们对应于外部数据库的ID,所以我试图简单地按ID查找它们。所有ID字段都被索引

当我正在编写的谓词变得相当大时,问题就出现了,因为用户可以从许多不同的标记中进行筛选。这些标签分为3个类别[出版物、品牌和产品],因此我的查询设置为在一个类别中使用“或”,在这些类别中使用“和”

示例查询谓词的结果如下所示:

(parentPublication.publicationId==1 OR parentPublication.publicationId==2 OR parentPublication.publicationId==5) 
AND (ANY brands.brandId==12 OR ANY brands.brandId==2 OR ANY brands.brandId==0 OR ANY brands.brandId==3 OR ANY brands.brandId==5 OR ANY brands.brandId==6 OR ANY brands.brandId==7) 
AND (ANY products.productId==2 OR ANY products.productId==3 OR ANY products.productId==6)
它们可以变得更大,但你明白了。我的问题是,由于所有这些都是执行昂贵的连接,一旦用户选择10或15个以上,查询就会运行得非常长,甚至可能导致应用程序崩溃

似乎更有效的方法是编写以下内容:

parentPublication.publicationId IN (1,2,5) 
AND (ANY brands.brandId IN (12,2,0,3,5,6,7))
AND (ANY products.productId IN (2,3,6))
但我似乎无法使用这种语法

所以我的问题是:这种语法受支持吗?如果是,有人能告诉我如何正确地编写它吗


或者,有没有更好的方法可以同时针对核心数据进行此类查询?

使用集合谓词,如

[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs];
[NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs];
[NSPredicate predicateWithFormat:@"product.productID in %@", productIDs];
现在您只需保留三个属性数组,并使用
和predicatewithsubpredicates创建一个三向复合谓词

[NSCompoundPredicate andPredicateWithSubPredicates:@[
   pubPredicate, brandPredicate, productPredicate]];

应该可以执行。

谢谢@Mundi,但每当我尝试使用该语法时,它都会给我一个错误:无法解析格式字符串“ANY brands.brandId IN(12,0,1)”'相同的结果:“NSInvalidArgumentException”,原因:“无法解析格式字符串“ALL brands.brandId IN(12,0,1)”。似乎不允许将数组结构传递给'IN'子句,或者格式不正确。非常抱歉。我只是在谓词编程指南中查找了它。只需完全省略任何或全部。我不知何故受到了这个问题的制约。请原谅我浪费你的时间。我希望它现在能工作。您的数组必须是
NSNumber
对象
@[@12,@0,@1]
这可能是问题所在,似乎使用整数有点不好,因为当我将id转换为字符串时,它工作得很好。最后,我用以下格式手工构建谓词字符串:{12,0,3,4,5,6,7,8,9,11}中的ANY brands.brandId)和{0,1,2,4,3,5,6,8}中的ANY products.productId),结果成功了。谢谢你至少让我走上了正轨。