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];
}

これは Shop エンティティです:

ここに画像の説明を入力

名前を小文字に変換shopSearchBar.textし、小文字形式で含まれているかどうかを確認する必要があります。

例:

以下の4つのショップがあります。

  • ショップ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)リポジトリに列(小文字の名前)を追加できます。ショップを保存するたびに、その名前の小文字のみのバージョンを保存します。次に、あなたの述語はただ比較するだけです:)

(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 に答える