NSPredicate包含一个包含数字和字母的字符串中的搜索

时间:2012-10-15 15:54:53

标签: ios core-data nsstring nspredicate

我必须使用NSPredicate来搜索某些Core Data对象。但是自定义对象的键name可以包含数字和字母。 字符串可能如下:John 1234 LennonRingo Starr。 我通常会使用谓词NSPredicate *predicate = [NSPredicate predicateWithFormat:@"Any name CONTAINS[cd] %@",searchString];

但是,如果我搜索John Lennon谓词不会返回任何内容,因为如果它包含字符John Lennon则无法比较,因为它缺少1234。任何提示我可以使用什么样的谓词?

3 个答案:

答案 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];