NSPredicate如何过滤对象字段

时间:2014-08-15 17:18:41

标签: ios objective-c nspredicate

如何按特定字段过滤对象数组?

我的代码:

NSMutableArray *inputArray = [[NSMutableArray alloc]init];
Person *person = [[Person alloc]init];
person.first_name = @"John";
[inputArray addObject: person];

person = [[Person alloc]init];
person.first_name = @"Jack";
[inputArray addObject: person];

NSString *expression = [NSString stringWithFormat:@"SUBQUERY(inputArray, $object, $object.first_name CONTAINS[c] J"];

NSPredicate *predicate = [NSPredicate predicateWithFormat:expression];
NSMutableArray *filteredArray = [[inputArray filteredArrayUsingPredicate:predicate]mutableCopy];

NSLog(@"Count should be 2: %lu",(unsigned long)filteredArray.count);

这是我得到的错误:

'NSInvalidArgumentException', reason: 'Unable to parse the format string "SUBQUERY(inputArray, $object, $object.first_name CONTAINS[c] J"'

这是测试的基本示例。实际情况是我有一个对象数组(Person或其他),我想通过对象中的某些字段过滤该数组,即first_name。作为用户类型,我们将根据他们输入的内容过滤视觉列表 - 因此输入" J"会产生2个结果,但是当他们输入" Jo"只有"约翰"出现在名单上。

我做错了什么?

修改

似乎还没有奏效。更新的代码:

DOVisitor *vi = [inputArray objectAtIndex:0];
NSLog(@"NAME: %@",vi.first_name);
NSPredicate *firstNamePredicate=[NSPredicate predicateWithFormat:@"first_name LIKE[cd] %@", @"Jo"];
NSPredicate *lastNamePredicate =[NSPredicate predicateWithFormat:@"last_name LIKE[cd] %@", @"Jo"];

NSPredicate *finalPredicate = [NSCompoundPredicate orPredicateWithSubpredicates : @[firstNamePredicate, lastNamePredicate]];
NSArray *filteredArray = [[inputArray filteredArrayUsingPredicate:finalPredicate]mutableCopy];

NSLog(@"Count should be 1: %d", [filteredArray count]);

我得到一个空数组。但是,当我打印inputArray的第一个对象时,控制台会记录" John"

修改

使用CONTAINS代替LIKE可以解决问题

2 个答案:

答案 0 :(得分:1)

你不需要这个子查询,这是一个非常基本的过滤器。

NSPredicate * predicate = [NSPredicate predicateWithFormat:@"first_name CONTAINS[cd] %@", @"j"];

答案 1 :(得分:1)

我们假设您有Person个对象,并且您正在尝试搜索firstNamelastName,然后您可以使用:

NSPredicate *firstNamePredicate=[NSPredicate predicateWithFormat:@"firstName LIKE[cd] %@", @"Jo"];
NSPredicate *lastNamePredicate =[NSPredicate predicateWithFormat:@"lastName LIKE[cd] %@", @"Jo"];

NSPredicate *finalPredicate = [NSCompoundPredicate orPredicateWithSubpredicates : @[firstNamePredicate, lastNamePredicate]];

最终谓词由or先前的谓词生成。因此,即使JofirstName中存在lastName,该Person对象也会通过谓词测试。

编辑:

获取具有上述谓词的过滤对象

NSArray *filteredArray = [inputArray filteredArrayUsingPredicate:finalPredicate];