我正在编写一个具有照片数据库的应用程序.每张照片都有几个与之相关联的标签,并且该应用程序具有一个搜索页面,其中包含大量切换,允许用户仅基于他们感兴趣的标签来搜索照片.这些标签中的每一个都存储了整数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,3,5,6,7)) AND (ANY products.productId IN (2,6))
但我似乎无法使该语法工作.
所以我的问题是:这种类型的语法是否支持,如果是这样,有人可以告诉我如何正确写?
还是有更好的方式来一起处理这种类型的核心数据查询?
解决方法
使用收集谓词,如
[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@",pubIDs]; [NSPredicate predicateWithFormat:@"brands.brandID in %@",brandIDs]; [NSPredicate predicateWithFormat:@"product.productID in %@",productIDs];
现在,您只需要保留三个属性数组,并使用andPredicateWithSubpredicates创建一个三元复合谓词.
[NSCompoundPredicate andPredicateWithSubPredicates:@[ pubPredicate,brandPredicate,productPredicate]];
应该执行OK.