k.v*_*k.v 9 core-data nspredicate ios
我正在编写一个包含照片数据库的应用程序.每张照片都有几个与之关联的标签,应用程序的搜索页面包含大量切换功能,允许用户仅根据他们感兴趣的标签搜索照片.这些标签中的每一个都存储了整数 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)
Run Code Online (Sandbox Code Playgroud)
他们可以变得更大,但你明白了.我的问题是,由于所有这些都在执行昂贵的连接,一旦用户选择超过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))
Run Code Online (Sandbox Code Playgroud)
但我似乎无法使用该语法.
所以我的问题是:是否支持这种语法,如果是这样,有人可以告诉我如何正确编写它吗?
或者是否有更好的方法可以同时处理针对Core Data的此类查询?
Mun*_*ndi 16
使用集合谓词,比如
[NSPredicate predicateWithFormat:@"parentPublication.publicationID in %@", pubIDs];
[NSPredicate predicateWithFormat:@"brands.brandID in %@", brandIDs];
[NSPredicate predicateWithFormat:@"product.productID in %@", productIDs];
Run Code Online (Sandbox Code Playgroud)
现在,您只需保留三个属性数组,并使用三元组复合谓词andPredicateWithSubpredicates.
[NSCompoundPredicate andPredicateWithSubPredicates:@[
pubPredicate, brandPredicate, productPredicate]];
Run Code Online (Sandbox Code Playgroud)
应该执行正常.
| 归档时间: |
|
| 查看次数: |
3004 次 |
| 最近记录: |