web-dev-qa-db-ja.com

NSPredicateに小文字の文字列が含まれています

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

これはショップエンティティです。

enter image description here

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

例:

私はこれらの4つの店を持っています:

  • ショップ1
  • ショップ1
  • 私の店
  • ショップ

ユーザー検索テキストが「ショップ」の場合は、それらすべてを返す必要があります。

その方法を知っていますか?

19
VansFannel

これは私が私の問題を解決した方法です:

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

NSPredicatのpredicateWithBlock:メソッドを使用できるはずです。

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [self.name compare:shopSearchBar.text options:NSCaseInsensitiveSearch] == NSOrderedSame; }];
3
mjvotaw

(a)リポジトリに列(lowercaseName)を追加し、ショップを保存するたびに、その名前の小文字のみのバージョンを保存することができます。次に、あなたの述語は単に比較です:)

(b)ただし、大文字と小文字を区別しない比較を行うだけの場合は、次のようにしてください。

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

これも発音区別符号を区別しない比較です。その他のオプションについては、 このドキュメントページ の文字列比較セクションを参照してください。

(a)クエリは高速になりますが、コードはより複雑になります。 (b)非常に単純なsaveメソッドを提供しますが、(少し)クエリが遅くなります

2
deanWombourne