Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 数组中字符串的NSPredicate是否不区分大小写?_Cocoa_Core Data_Nspredicate - Fatal编程技术网

Cocoa 数组中字符串的NSPredicate是否不区分大小写?

Cocoa 数组中字符串的NSPredicate是否不区分大小写?,cocoa,core-data,nspredicate,Cocoa,Core Data,Nspredicate,在这种情况下,我希望通过用户名键从核心数据存储中获取对象,但我希望比较不区分大小写。我的谓词是: username IN $usernames 然后,我用字符串数组进行变量替换,这些字符串是我想要查找的用户名。它可以工作,但区分大小写。我想我会做这样的事情: username IN[c] $usernames 不幸的是,这似乎不起作用。字符串比较必须仍然以区分大小写的方式进行。(我没有收到关于它是不受支持的查询的错误。) 是否有其他方法来编写此谓词,使其按照我需要的方式工作,或者我只是缺少了

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

username IN $usernames
然后,我用字符串数组进行变量替换,这些字符串是我想要查找的用户名。它可以工作,但区分大小写。我想我会做这样的事情:

username IN[c] $usernames
不幸的是,这似乎不起作用。字符串比较必须仍然以区分大小写的方式进行。(我没有收到关于它是不受支持的查询的错误。)


是否有其他方法来编写此谓词,使其按照我需要的方式工作,或者我只是缺少了一些明显的内容?

在对SQLite存储执行获取时,IN运算符上的case修饰符显然被忽略。(您在问题中忽略了门店类型。)

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

我还建议在bug reporter中提交一个功能请求,以便将来考虑支持

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


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

您可以尝试类似于
的任何$username,如[c]username
。我做过类似的事情,这里没有变量substitution,而是有一个像“persons.name”这样的关键路径,这个谓词对我有效。不确定它是否与那里的变量(而不是关键路径)有任何不同,但值得一试。

这里是另一种解决方法,但要求您更改MOM

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

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


这可能有些过分,但可以让您根据需要运行搜索。

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

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/set比较和中的
,操作符左侧只允许使用键

更新:

在对表达式和谓词进行了一些研究之后,我发现了另一种方法,似乎效果很好:

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

这将使用函数表达式
小写:
获取值的小写表示形式。剩下要做的就是确保
值的所有条目都是小写的,并且您可以在
表达式中使用不区分大小写的

您是通过谓词生成器还是直接在代码中构建谓词?这是存储在数据模型中的获取请求。不幸的是,该谓词不适用于SQLite存储。(未实现SQL生成。)在它确实有效的情况下,请注意确保字符串sin$usernames已转义类似文本的通配符。对于最后一点,当用作谓词字符串时,您的意思是==吗?当以编程方式构建谓词时,它仍然有效吗?我的目标是10.5。在10.5上测试后,它看起来不起作用。该死!似乎我唯一的选择就是构建一个类似于:“username包含[cd]$u,$u包含[cd]username”的表达式。唉。不。即使使用两个包含也不会起作用,因为我的整体表达式是一个OR或一堆其他谓词,似乎我不能有一个OR集合包含And谓词。废话。在把这一切都搞错之后,我转而使用LIKE[cd]并避开了*和?输入字符串中的字符。工作起来很有魅力。谓词处理中似乎有很多令人不安的限制……比如[c]和转义*和?是必须在10.5上部署时的典型解决方案。
NSPredicate *predicate =
   [NSPredicate predicateWithFormat:
     @"lowercase(value) IN %@", values];