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

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

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

这是可行的,但问题是搜索是区分大小写的,因此如果关键字有大写字母,但用户输入的全部是小写字母,则找不到匹配。我尝试了以下修改:

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

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

附录: 经过进一步的探索,添加自定义访问器的解决方案对于手动使用 NSPreate 来说是可行的,但是在使用 NSFetchRequest 和 Core Data 时就完全不可行了,只有在查询 Core Data 模型中定义的属性时才可行。

63763 次浏览

我相信答案是:

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

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

Predicate Format String Syntax

如果我没有理解错的话,您希望在任何关键字名称与搜索字符串匹配时谓词为 true。为此,您需要像下面这样使用 ANY 关键字进行测试:

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

这将搜索关键字,如果其中任何关键字名称包含您的搜索字符串,则返回 true。

如果您试图只捕获等于名称,但是使用不敏感的大小写,我认为这是最佳解决方案

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

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

就我而言,我做到了:

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

如果您希望同时使用不区分大小写和通配符,请使用:

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

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

LIKE对字符串文字不起作用。