NSPredicate对多对多关系不区分大小写的匹配

Bri*_*ter 65 cocoa core-data objective-c

我正在实现一个搜索字段,用户可以在其中键入字符串以过滤视图中显示的项目.显示的每个对象都有一个keywords多对多关系,我希望能够根据关键字过滤对象.每个关键字对象都有一个name属性,所以我设置了一个NSPredicate来进行如下所示的过滤:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString];
Run Code Online (Sandbox Code Playgroud)

这有效,但问题是搜索区分大小写,因此如果关键字具有大写字母但用户输入全部小写,则不会找到匹配项.我尝试过以下修改:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString];
Run Code Online (Sandbox Code Playgroud)

但这对匹配的区分大小写没有任何影响.有没有办法只使用普通谓词来进行不区分大小写的匹配?或者我是否需要在关键字类上实现某种自定义访问器,例如编写一个lowercaseName方法并匹配较低版本的搜索字符串?

附录:经过进一步探索后,添加自定义访问器的解决方法适用于手动使用NSPredicate,但在将NSFetchRequest与Core Data一起使用时根本不起作用,这仅在查询Core Data模型中定义的属性时有效.

Alf*_*nso 88

如果我理解正确,那么只要任何关键字名称与搜索字符串匹配,您就希望谓词为真.为此,您需要使用以下ANY关键字进行测试:

[NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...];
Run Code Online (Sandbox Code Playgroud)

这将搜索关键字,如果这些关键字中的任何一个包含您的搜索字符串,则返回true.


sla*_*ick 49

我相信答案是:

[NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString];
Run Code Online (Sandbox Code Playgroud)

字符串比较默认情况下是变音符号和变音符号敏感的.您可以使用方括号内的关键字符c和d修改运算符,以分别指定大小写和变音符号不敏感,例如firstName BEGINSWITH [cd] $ FIRST_NAME.

谓词格式字符串语法


wal*_*wal 13

如果你试图只捕获等号但是不敏感的情况,我认为这是最好的解决方案

[NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...];
Run Code Online (Sandbox Code Playgroud)

你帮助了我很多.多谢你们!!!

在我的情况下,我做了:

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"];
Run Code Online (Sandbox Code Playgroud)

  • 天啊!!!!!!!!!!这也有效.. == [c].我没试过这个!什么是glob patthern,我用Google搜索了但是......这是正则表达式吗? (8认同)
  • 小提示:对于谁在Realm中使用NSPredicate,不支持"LIKE". (3认同)

net*_*000 6

如果必须在匹配关键字但搜索必须区分敏感的,那么你应该使用NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKE 不适用于字符串文字.