使用NSPredicate在NSArray中查找类似于SQL WHERE IN子句的元素

时间:2014-08-22 13:50:06

标签: ios objective-c nsarray nspredicate

我有一个NSArray,比如Article对象。 Article对象包含另一个NSArray标签。 所以我想找到包含一组标签的文章,如[iphone,apple,music]。 在SQL中它就像:WHERE tags IN ('iphone', 'apple', 'music')。 到目前为止,我只找到了如何使用NSPredicate通过单个值查找元素:

NSArray *filteredItems = [article filteredArrayUsingPredicate:
                                       [NSPredicate predicateWithFormat:@"tag == %@", @"iphone"]];

有办法做我需要的吗?

4 个答案:

答案 0 :(得分:2)

您可以使用ANY和IN子句

NSArray *tags = ...; [NSPredicate predicateWithFormat:@"ANY tags.name IN %@",tags]

答案 1 :(得分:1)

您可以使用NSCompoundPredicate将各种NSPredicate对象合并在一起,如下所示:

NSMutableArray *predicates = [NSMutableArray array];

[predicates addObject:[NSPredicate predicateWithFormat:@"tag == %@", @"iphone"]]];
[predicates addObject:[NSPredicate predicateWithFormat:@"tag == %@", @"apple"]]];
[predicates addObject:[NSPredicate predicateWithFormat:@"tag == %@", @"music"]]];

//Create a predicate using AND
NSPredicate *compoundANDpred = [NSCompoundPredicate andPredicateWithSubpredicates:predicates];

//Create a predicate using OR
NSPredicate *compoundORpred = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];

或者您可以使用带有ANY和IN的谓词,如其他一些答案中所述。

答案 2 :(得分:0)

您可以使用下面的谓词

NSPredicate *template = [NSPredicate predicateWithFormat:@"tag == %@ OR tag == %@ OR tag == %@",@"iphone",@"apple",@"music"];

答案 3 :(得分:0)

这也可以这样做

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"tag == %@", @[@"iphone", @"apple", @"music"]];
NSArray *result = [dataArray filterUsingPredicate:predicate];