2010-01-06 112 views
8

我有一种情况,我想通过用户名键从核心数据存储中获取对象,但我希望比较是不区分大小写的。谓词我是这样的:对数组中的字符串不区分大小写NSPredicate?

username IN $usernames 

我那么做了变量替换是我想找的用户名字符串数组。它可以工作,但区分大小写。我想这样做,我想:

username IN[c] $usernames 

不幸的是,似乎不工作。字符串比较必须仍然以区分大小写的方式进行。 (我不知道它是一个不支持的查询错误。)

有没有不同的方式来写这个谓词,所以它的工作方式,我需要或我只是失去了一些明显的东西?

+0

您是通过谓词构建器还是直接在代码中构建谓词? – Anurag 2010-01-06 23:36:36

+0

这是一个存储在数据模型中的提取请求。 – Sean 2010-01-07 01:37:09

回答

9

在对SQLite存储执行提取操作时,显然会忽略IN运算符上的大小写修饰符。 (您从您的问题中省略了商店类型。)

我建议根据文档提交一个错误,以便可以记录此限制/行为。

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

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

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

+0

为了您的最后一点,您是否将==用作谓词字符串?以编程方式构建谓词时它仍然工作吗?我瞄准了10.5。 – Sean 2010-01-07 17:47:15

+1

在10.5上进行测试后,它看起来不起作用。该死!看来我唯一的选择就是建立一个如下的表达式:“username CONTAINS [cd] $ u and $ u CONTAINS [cd] username”。叹。 – Sean 2010-01-07 19:31:46

+0

而且没有。即使使用两个CONTAINS也行不通,因为我的整体表达式是一堆其他谓词的OR,并且看起来我不能有一个包含AND谓词的OR集。等等。经过这一切都错了,我切换到使用LIKE [cd]和逃避*和?来自我输入字符串的字符。奇迹般有效。似乎有一个相当令人痛苦的数量的谓词处理的限制... – Sean 2010-01-07 20:32:10

1

您可能会尝试类似ANY $usernames LIKE[c] username。我做了类似的事情,其中​​代替变量替换,我只是有一个关键路径,如“persons.name”,并且谓词适用于我。不知道它是否与其中的变量有什么不同,而不是关键路径,但值得一试。

+0

不幸的是,该谓词不能用于SQLite存储。 (未实现的SQL生成。)在它工作的情况下,注意确保字符串sin $ usernames具有文字LIKE通配符转义。 – 2010-01-07 04:24:31

1

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

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

现在的读取请求时,设置实体为“用户名”,然后运行这个谓词(假设一个“名字”属性“家长”的属性):

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

这可能是矫枉过正,但将允许您可以根据需要运行搜索。

-1

虽然这个问题是几年前我只是在同样的问题,迷迷糊糊地解决了这个问题是这样的:

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)' 

我觉得对于数组/词典/套comparisions和IN有只允许键在操作员的左侧。

UPDATE:

的表达式和我找到了另外的形式给出了一些研究之后,似乎工作得很好:

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

此使用函数表达式lowercase:得到的小写字母表示值。剩下要做的就是确保values的所有条目都是小写字母,并且您可以使用不区分大小写的IN表达式。

相关问题