4

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

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

4

3 回答 3

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

并将其提供给您的查询

在现实生活中,我会对每个令牌进行一些验证,以检查它是否会做出有效的谓词并且不会崩溃或产生安全风险。例如剥离特殊字符,如“* []”

编辑:更正谓词类型以处理问题情况。

于 2012-10-15T16:09:43.683 回答
0

您可以将搜索字符串拆分为字符串数组,然后切换谓词以查找名称中的任何字符串:

NSArray *strings = [searchString componentsSeparatedByString:@" "];

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY %@ IN name",strings];
于 2012-10-15T19:48:06.010 回答
0

尝试使用 LIKE 而不是 contains,然后您可以使用通配符,例如 John*Lennon 应该匹配以 John 开头并以 Lennon 结尾且其间包含任意数量的其他字符的字符串。您可以使用 ?相反,如果您想更好地控制匹配的内容,每个问号只会匹配一个字符。

于 2012-10-15T18:25:59.480 回答