代码之家  ›  专栏  ›  技术社区  ›  Sean

对数组中的字符串不区分大小写的nspredicate?

  •  8
  • Sean  · 技术社区  · 16 年前

    在这种情况下,我希望通过用户名密钥从核心数据存储中获取对象,但我希望比较不区分大小写。我的谓词是:

    username IN $usernames
    

    然后,我用一个字符串数组进行变量替换,这些字符串是我要查找的用户名。它有效,但区分大小写。我想我想做点类似的事情:

    username IN[c] $usernames
    

    不幸的是,这似乎不起作用。字符串比较必须以区分大小写的方式进行。(对于不支持的查询,我不会出错。)

    写这个谓词的方法有没有不同,使它按我需要的方式工作,或者我只是在这里遗漏了一些明显的东西?

    4 回复  |  直到 16 年前
        1
  •  10
  •   Jim Correia    16 年前

    在对sqlite存储区执行提取时,显然忽略了in运算符上的case修饰符。(您的问题中省略了商店类型。)

    我建议针对文档归档一个bug,以便记录这种限制/行为。

    我还建议在bug报告程序中提交一个特性请求,这样可以考虑将来的支持。

    同时,您必须将提取请求从数据模型中提取出来,并通过编程构建它。您可以构建一个复合谓词或谓词,对每个值进行不区分大小写的相等匹配(并测试它是否满足您的性能需求)。

    请注意,如果您支持10.6之前的OS目标,则不支持==上的case修饰符,在这种情况下,还需要另一个替代解决方案。

        2
  •  1
  •   Brian Webster    16 年前

    你可以试一下 ANY $usernames LIKE[c] username . 我做过类似的事情,在这里,我没有使用变量子步,而是使用一个键路径,比如“persons.name”,这个谓词对我很有用。不确定它是否对变量(而不是关键路径)有任何不同的作用,但值得一试。

        3
  •  1
  •   Corey Floyd    16 年前

    这是另一个解决办法,但需要你换妈妈。

    使用户名成为完整的实体。在用户名和其他实体之间创建反向关系。

    现在,对于fetch请求,将实体设置为“username”,然后运行该谓词(假定为“name”属性和“parent”属性):

       [NSPredicate predicateWithFormat:"(name like[c] %@) && (parent == %@)", theUserName, theParentObject]
    

    这可能是杀伤力过大,但允许您根据需要运行搜索。

        4
  •  -1
  •   lupz    11 年前

    虽然这个问题已经有好几年的历史了,但我还是偶然发现了同样的问题,并像这样解决了它:

    NSArray  *values = @[@"FOO", @"bar" ,@"lorem"];
    NSString *predicate;
    
    predicate = @"value LIKE[cd] '";
    predicate = [predicate stringByAppendingString:
                 [values componentsJoinedByString:
                  @"' OR  value LIKE[cd] '"]];
    predicate = [predicate stringByAppendingString:@"'"];
    
    NSLog(@"%@",  predicate);
    // Output:
    // value LIKE[cd] 'FOO' OR  value LIKE[cd] 'bar' OR  value LIKE[cd] 'lorem'
    

    这将从值列表中创建静态谓词表达式。也许对某人有用。

    更新2:

    实际上,下面的更新解决方案似乎不适用于sqlite,并生成

    'NSInvalidArgumentException',
    reason: 'unimplemented SQL generation for predicate : ... (bad LHS)'
    

    我认为数组/dict/集合比较和 IN 操作员左侧只允许使用钥匙。

    更新:

    在对表达式和谓词进行了一些研究之后,我发现了另一个很好的方法:

    NSPredicate *predicate =
       [NSPredicate predicateWithFormat:
         @"lowercase(value) IN %@", values];
    

    这将使用函数表达式 lowercase: 获取值的小写表示形式。剩下要做的就是确保 values 是小写的,您可以使用不区分大小写的 在 表达。

    推荐文章