我必须使用 NSPredicate
来搜索一些 Core Data 对象。但是自定义对象的键 name
可以同时包含数字和字母。
该字符串可能类似于:John 1234 Lennon
或 Ringo Starr
。
我通常会使用谓词 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",searchString];
但是,如果我搜索 John Lennon
谓词不会返回任何内容,因为它无法比较它是否包含字符 John Lennon
,因为缺少1234
。我可以使用哪种谓词有什么提示吗?
最佳答案
您可以标记您的查询,可能就像
一样简单NSArray *tokens = [querystring componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
然后构造一个复合谓词。
NSMutableArray *predarray = [NSMutableArray array];
for(NSString *token in tokens)
{
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",token];
[predarray addObject:predicate];
}
NSPredicate *final = [NSCompoundPredicate andPredicateWithSubpredicates:predarray];
并将其提供给您的查询
在现实生活中,我会对每个 token 运行一些验证,以检查它是否会成为一个有效的谓词,并且不会崩溃或产生安全风险。例如去除特殊字符,如“* []”
编辑:更正谓词类型以处理问题情况。
关于ios - NSPredicate 包含搜索包含数字和字母的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12899388/