代码之家  ›  专栏  ›  技术社区  ›  Brian Webster

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

  •  64
  • Brian Webster  · 技术社区  · 16 年前

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

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

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

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

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

    附录: 经过进一步的探索,添加自定义访问器的解决方案对于nspredicate的手动使用是可以的,但是在对核心数据使用nsfetchrequest时根本不起作用,这只在查询核心数据模型中定义的属性时起作用。

    5 回复  |  直到 7 年前
        1
  •  86
  •   Alfonso    15 年前

    如果我正确理解您的意思,您希望您的谓词在任何关键字名称与搜索字符串匹配时都为真。为此,您需要使用以下任何关键字进行测试:

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

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

        2
  •  49
  •   slatvick    7 年前

    我相信答案是:

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

    字符串比较在默认情况下区分大小写和音调符号。您可以使用方括号内的键字符c和d修改运算符,分别指定大小写和音调符号不敏感,例如first name beginswith[c d]$first_name。

    Predicate Format String Syntax

        3
  •  13
  •   wal    15 年前

    如果你只想捕捉等号,但不区分大小写,我认为这是最好的解决办法。

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

    你帮了我很多。谢谢大家!!!!

    在我的案例中,我做到了:

    [NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"];
    
        4
  •  5
  •   netshark1000    9 年前

    如果必须匹配关键字,但搜索必须是case- 在里面 敏感的话你应该用 NSPredicate(format: "keywords.name =[c] %@", self.searchString)

    LIKE 不适用于字符串文本。

        5
  •  1
  •   Sven    12 年前

    如果要区分大小写和通配符,请使用以下命令:

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