NSPredicate具有多个参数

时间:2011-06-08 11:18:59

标签: xcode core-data nspredicate

你好需要谓词的帮助。问题是我希望有一个从数据库获取的函数取决于它接收的多个值,但这些值并不总是存在,这是否意味着我必须创建几个不同的谓词?

以下代码

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND brand_id LIKE %@ AND item_category LIKE %@ AND item_make LIKE %@ AND item_gender LIKE %@ || item_price>%@ || item_price<%@",
                              brand_one, brand_two, brand_three, brand_four, brand_five, categoryString, makeString, genderString,[NSNumber numberWithInt:price_bottom],[NSNumber numberWithInt:price_top]];

brand_one,brand_two等有时存在,有时则不存在。

例如,如何以item_gender为例。如果没有指定性别而不是同时拥有它们,那就是。

很抱歉,如果我对问题的描述令人困惑。

基于Gobras评论,以下代码生成

NSArray *brands = [NSArray arrayWithObjects:brand_one, brand_two, brand_three, brand_four, brand_five, nil];

    NSPredicate *predicate_brands = [NSPredicate predicateWithFormat:@"brand_id like %@" argumentArray:brands];

搜索功能应该

的逻辑解释
  1. fetchrequest
  2. 提取请求的谓词
  3. 谓词基于5个品牌ID,商品ID,商品类别,商品品牌,商品性别, 如果上面的任何一个是空的,它应该获取所有相关的条目,例如,如果项目类别为空,它应该获取所有“珠宝,手表等”,但用其余的谓词表达式限制它。

    我是否应该为品牌创建复合谓词,而不是为项目类别创建另一个值为“item_category like Jewellery”和“item_category like Watches”,之后如何将它们完全结合在一起?

3 个答案:

答案 0 :(得分:62)

将适当的单个谓词集合汇编到NSCompoundPredicate

,如

NSMutableArray *parr = [NSMutableArray array];
if([brand_one length]) { 
    [parr addObject:[NSPredicate predicateWithFormat:@"brand_id LIKE %@",myBrandId]];
}
if([brand_two length]) { 
     // etc 
}

NSPredicate *compoundpred = [NSCompoundPredicate andPredicateWithSubpredicates:parr];

您可以使用orPredicateWithSubpredicates:andPredicateWithSubpredicates:堆叠谓词,并且NSCompoundPredicate可以复制为NSPredicate。

请参阅 https://developer.apple.com/documentation/foundation/nscompoundpredicate

答案 1 :(得分:2)

对于那些对Swift感兴趣的人!

let arrPred = [NSPredicate(format: "yourAttribute LIKE %@", toCompareID), NSPredicate(format: "yourAttribute2 LIKE %@", toCompareID2)] //Add as many predicates you want in short make your query

let compoundpred:NSPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: arrPred)
var arrFiltered = yourArray.filteredArrayUsingPredicate(compoundpred)

答案 2 :(得分:1)

动态构建谓词非常简单:将谓词格式字符串与所需条件数组合,并使用参数构建相应的 NSMutableArray [NSPredicate predicateWithFormat:argumentArray:]将完成剩下的工作。