8

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

username IN $usernames

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

username IN[c] $usernames

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

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

4

4 回答 4

11

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

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

我还建议在错误报告器中提交功能请求,以便将来支持。

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

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

于 2010-01-07T02:19:20.923 回答
1

你可以尝试类似的东西ANY $usernames LIKE[c] username。我已经做了类似的事情,而不是变量替换,我只有一个像“persons.name”这样的关键路径,并且该谓词对我有用。不确定它是否与那里的变量而不是关键路径有什么不同,但值得一试。

于 2010-01-07T03:39:49.937 回答
1

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

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

现在对于获取请求,将实体设置为“用户名”,然后运行此谓词(假设“名称”属性和“父”属性):

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

这可能有点矫枉过正,但可以让您根据需要运行搜索。

于 2010-01-07T17:59:43.157 回答
-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)'

我认为对于数组/字典/集合比较,IN运算符左侧只允许使用键。

更新:

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

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

这使用函数表达式lowercase:来获取值的小写表示。剩下要做的就是确保 的所有条目values都是小写的,并且您将能够使用不区分大小写的IN表达式。

于 2015-04-13T11:40:11.783 回答