2009-09-24 10 views
62

私は検索フィールドを実装しています。このフィールドでは、ユーザーが文字列を入力してビューに表示される項目をフィルタできます。表示される各オブジェクトにはkeywordsの多対多の関係があり、そのキーワードに基づいてオブジェクトをフィルタリングできるようにしたいと考えています。各キーワードオブジェクトはname性質を持っているので、私はこのようになりますフィルタリングを行うためにNSPredicateを設定している:NSPredicate大文字と小文字を区別しない多対多マッチング

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS %@", self.searchString]; 

これは動作しますが、問題は、検索では大文字と小文字が区別されることで、その場合キーワードは大文字ですが、ユーザーはすべて小文字で入力します。一致するものは見つかりません。私は次の修正を試みました:

NSPredicate* predicate = [NSPredicate predicateWithFormat:@"keywords.name CONTAINS[c] %@", self.searchString]; 

しかし、これはマッチングの大文字と小文字の区別に違いはありません。単純な述語を使ってこの大文字と小文字を区別しないマッチングを行う方法はありますか?または、キーワードクラスにカスタムアクセサを実装する必要がありますか? lowercaseNameメソッドを作成し、検索文字列の小文字のバージョンと照合しますか?

補足: カスタムアクセサを追加する回避策は、NSPredicateを手動で使用するには問題ありませんが、Core DataでNSFe​​tchRequestを使用する場合はまったく機能しません。コアデータで定義された属性モデル。

答えて

79

私が正しくあなたを理解していれば、あなたが任意のキーワード名は、検索文字列に一致するたびに述語が真であるにしたいです。このためには、次のようなANYキーワードでテストする必要があります。

[NSPredicate predicateWithFormat:@"ANY keywords.name CONTAINS[c] %@", ...]; 

これはキーワードを検索し、それらのキーワード名のいずれかに検索文字列が含まれている場合はtrueを返します。

+1

私は欠けていた方法がなければならないことを知っていました。魅力のように動作します。ありがとう! –

42

私は答えがあると信じて:

[NSPredicate predicateWithFormat:@"keywords.name CONTAINS[cd] %@", self.searchString]; 

String comparisons are by default case and diacritic sensitive. You can modify an operator using the key characters c and d within square braces to specify case and diacritic insensitivity respectively, for example firstName BEGINSWITH[cd] $FIRST_NAME.

Predicate Format String Syntax

+0

これは元の質問に投稿された2回目の試みと本質的に同じですが、発音区別フラグの追加だけが異なります。問題は、式の左辺が単純な文字列でない場合にはこれが機能しないことです。 –

+1

私にとって、[d]オプションは私にこのエラーを与えました: '未知の例外のためにアプリケーションを終了しました '無効な述語オプション'、理由: 'NSDiacriticInsensitivePredicateOptionは文字列型ではサポートされていません' – Zeb

+0

私も。私は同じエラーがあります。 –

12

あなたがキャッチしようとしている場合は、名前だけに等しいが、大文字小文字を区別しないで、私はそれはあなたが私をたくさん助けた最適なソリューション

[NSPredicate predicateWithFormat:@"ANY keywords.name LIKE[c] %@", ...]; 

だと思います。みんなありがとう!!!私は私の場合は

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"]; 
+0

'LIKE'はglob(?*)マッチング演算子です。これは '%@'に渡す文字列がグロブパターンの場合にのみ正しく動作します。なぜなら、述語はそれを1と解釈するためです。文字列がグロブパターンでない場合、グロブが予想される場所に渡すと問題が発生します。厳密な平等が必要な場合は==を使用します。 –

+7

OH MAN !!!!!!!!!!これもうまくいく.. == [c]。私はこれを試していない!グッドパトナムって何ですか、私はそれを見つけましたが...それは正規表現ですか? – wal

+0

グローブは、一度に複数のファイル名を一致させるためにシェルで使用するパターンの一種です。 –

1

あなたは両方のケースは小文字を区別しないとワイルドカードたい場合は、この使用:あなたがキーワードに一致しなければならない場合

NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"(name like[c] '*%@*')",@"search"]]; 
+1

'NSPredicate * predicate = [NSPredicate predicateWithFormat:@"([c] '*%@ *')のような名前) "、@" search "];'で十分です。 – Zeb

2

をしかし、検索はを小文字は区別されなければなりませんを使用してください。NSPredicate(format: "keywords.name =[c] %@", self.searchString)

LIKEは文字列リテラルでは機能しません。

関連する問題