19

我正在使用 iOS SDK 6.0 和 XCode 4.5.2 开发一个 iOS 应用程序。我的目标开发是4.3。

我正在使用 Core Data 来管理我的数据。现在我有这个NSPredicate来搜索商店:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

这是商店实体:

在此处输入图像描述

我必须将名称转换为小写,看看它是否包含shopSearchBar.text小写格式。

例子:

我有这四个商店:

  • 店铺1
  • 1号店
  • 我的店铺
  • 店铺

如果用户搜索文本是 'shop',它必须返回所有这些。

你知道怎么做吗?

4

3 回答 3

70

这就是我解决问题的方法:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",
                              shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}
于 2013-01-30T19:31:57.247 回答
2

(a) 您可以在存储库中添加一列 - lowercaseName - 并且每次保存 Shop 时,保存其名称的仅小写版本。那么你的谓词只是比较:)

(b) 但是,如果您只想进行不区分大小写的比较,请尝试以下操作:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

这也是变音符号不敏感的比较。查看此文档页面的字符串比较部分以获取更多选项。

(a) 为您提供更快的查询但更复杂的代码。(b) 为您提供非常简单的保存方法,但(稍微)较慢的查询

于 2013-01-30T18:51:24.963 回答
2

您应该可以使用 NSPredicat 的 predicateWithBlock: 方法:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [self.name compare:shopSearchBar.text options:NSCaseInsensitiveSearch] == NSOrderedSame; }];
于 2013-01-30T18:55:01.857 回答