你好需要谓词的帮助。问题是我希望有一个从数据库获取的函数取决于它接收的多个值,但这些值并不总是存在,这是否意味着我必须创建几个不同的谓词?
以下代码
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];
搜索功能应该
的逻辑解释谓词基于5个品牌ID,商品ID,商品类别,商品品牌,商品性别, 如果上面的任何一个是空的,它应该获取所有相关的条目,例如,如果项目类别为空,它应该获取所有“珠宝,手表等”,但用其余的谓词表达式限制它。
我是否应该为品牌创建复合谓词,而不是为项目类别创建另一个值为“item_category like Jewellery”和“item_category like Watches”,之后如何将它们完全结合在一起?
答案 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:]
将完成剩下的工作。