NSPredicate等效于SQL的LIKE。

58

我正在寻找一种使用NSPredicate设置LIKE条件以获取对象的方法。除此之外,使用OR也会很有用。我正在尝试做的是,如果用户搜索“James”,我可以编写一个NSPredicate,其相当于:

select * from users where firstname LIKE '%James%' OR lastname LIKE '%James%';
3个回答

128
NSString *_mySearchKey = @"James";
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"(firstname CONTAINS[cd] %@) OR (lastname CONTAINS[cd] %@)", _mySearchKey, _mySearchKey];

37
找到了!这意味着不区分大小写和音符的情况。 - Pierre de LESPINAY
1
@AlexReynolds 为什么不使用 LIKE? - onmyway133
更好的问题是:为什么我应该使用LIKE呢? - Alex Reynolds
这段程序相关的内容需要翻译成中文。请仅返回翻译后的文本:当字符串为空时,代码“[NSPredicate predicateWithFormat:@"SELF CONTAINS[cd] %@", strFilter]”无法正常工作。有什么建议吗? - Add080bbA
在运行谓词测试之前,请检查字符串是否为空,并单独处理该情况。https://dev59.com/eXNA5IYBdhLWcg3wmfEa - Alex Reynolds
这个答案不会像LIKE一样给出结果,例如:S%会给出以S开头的结果,而包含将给出不以“S”开头的结果,将导致包含S的列表,这不是正确的结果,有什么解决方案? - iphonic

38

6
我知道这是很久以前的事情,但这并不起作用,因为NSPredicate不会替换带引号的内容'%@'会保持不变... - Vincent Guerci
1
beginswith[c] 对我来说已经足够了,但是还有人成功生成动态的 LIKE 查询,例如 '%@*' 吗? - Ege Akpinar
10
使用 like 的技巧是在参数中包含 * 标记。例如:NSPredicate *predicate = [NSPredicate predicateWithFormat:@"%K LIKE[cd] %@", kMDItemDisplayName, [NSString stringWithFormat:@"*%@*", appname]]; - Richard H.
1$@是什么作用? - shim
@shim 特别标识了第一个参数。与作者只使用 %@ 两次的情况形成对比;在那种情况下,他需要两次提供 _mySearchKey。例如:NSLog(@"%1$@ %1$@", @"Hat"); 将输出 "Hat Hat"。 - Tommy

10

另一种可能性

@"firstname beginswith[c] James"

作为contains的良好替代选项

有时候,contains并不总是正确的答案


1
不匹配“SuperJames” :) beginswith 不等于 sql 的 like '%foo%' - marsbear

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接