ios - NSPredicate如何过滤对象字段

标签 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"'

这是一个用于测试的基本示例。实际情况是我有一个对象数组(人或其他),我想通过对象中的某些字段过滤该数组,即 first_name。当用户键入时,我们将根据他们键入的内容过滤一个可视列表 - 因此键入“J”会产生 2 个结果,但是当他们键入“Jo”时,列表中只会出现“John”。

我做错了什么?

编辑

似乎还是不行。更新代码:

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 就可以了

最佳答案

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

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

关于ios - NSPredicate如何过滤对象字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25331065/

相关文章:

ios - 指针在函数接口(interface)上缺少可空性类型说明符

objective-c - block 作为 C 函数的参数或返回值

ios - Objective-c iOs 退出 View 时自动保存信息

ios - 核心数据获取返回意外结果

ios - CoreData:具有多个关系的NSPredicate

ios - XCode 在路径中没有有效的编译 Storyboard

ios - Sqlite 查询也可以获取带有相邻词的搜索词

ios - 在没有弹出权限对话框的情况下添加用户通知类别

ios - 内容偏移动画损坏