我必须使用NSPredicate
来搜索某些Core Data对象。但是自定义对象的键name
可以包含数字和字母。
字符串可能如下:John 1234 Lennon
或Ringo Starr
。
我通常会使用谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",searchString];
但是,如果我搜索John Lennon
谓词不会返回任何内容,因为如果它包含字符John Lennon
则无法比较,因为它缺少1234
。任何提示我可以使用什么样的谓词?
答案 0 :(得分:12)
您可以标记您的查询,可能就像
一样简单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];
并将其提供给您的查询
在现实生活中,我会对每个令牌进行一些验证,以检查它是否会产生有效的谓词,并且不会崩溃或产生安全风险。例如剥去像“* []”
这样的特殊字符编辑:更正谓词类型以处理问题情况。
答案 1 :(得分:0)
尝试使用LIKE而不是contains,然后你可以使用通配符,例如John * Lennon应匹配以John开头的字符串,并以Lennon结尾,其中包含任意数量的其他字符。您可以使用 ?相反,如果你想要更多地控制匹配的内容,那么每个问号只匹配一个字符。
答案 2 :(得分:0)
您可以将搜索字符串拆分为字符串数组,然后切换谓词以查找名称中的任何字符串:
NSArray *strings = [searchString componentsSeparatedByString:@" "];
NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY %@ IN name",strings];