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

我正在实现一个search字段,用户可以input一个string来筛选视图中显示的项目。 每个显示的对象都有一个keywords一对多的关系,我希望能够根据关键字过滤对象。 每个关键字对象都有一个name属性,所以我设置了一个NSPredicate来执行过滤,如下所示:

 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString]; 

这是有效的,但问题是search是区分大小写的,所以如果关键字有一个大写字母,但用户input全部小写,则不会find匹配项。 我已经尝试了以下修改:

 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString]; 

但是,在匹配的大小写敏感性方面没有任何区别。 有没有办法使用只是一个简单的谓词做这种不区分大小写的匹配? 或者我是否需要在关键字类上实现某种自定义访问器,例如,编写一个lowercaseName方法,并匹配searchstring的小写版本?

附录:在进一步的研究之后,添加自定义访问器的解决方法对于手动使用NSPredicate而言工作正常,但是在使用Core Data的NSFetchRequest时根本不起作用,只有在查询Core Data模型中定义的属性时才起作用。

如果我理解正确,只要任何关键字名称与searchstring匹配,就希望谓词为真。 为此,您需要使用如下所示的ANY关键字进行testing:

 [NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...]; 

这将search关键字,并返回true,如果任何这些关键字名称包含您的searchstring。

我相信答案是:

 [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString]; 

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

谓词格式string语法

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

 [NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...]; 

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

在我的情况下,我做了:

 [NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"]; 

如果您必须匹配关键字,但search必须是大小写敏感的,那么您应该使用NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKE不适用于string文字。

如果你想兼顾大小写和通配符,使用这个:

 NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(name like[c] '*%@*')",@"search"]];