web-dev-qa-db-ja.com

多対多リレーションシップでのNSPredicateの大文字と小文字を区別しないマッチング

ユーザーが文字列を入力してビューに表示されるアイテムをフィルタリングできる検索フィールドを実装しています。表示されている各オブジェクトにはkeywords対多の関係があり、キーワードに基づいてオブジェクトをフィルタリングできるようにしたいと思います。各キーワードオブジェクトにはnameプロパティがあるため、NSPredicateを設定して、次のようなフィルタリングを実行します。

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

これは機能しますが、問題は検索で大文字と小文字が区別されるため、キーワードに大文字が含まれていて、ユーザーがすべて小文字で入力した場合、一致するものは見つかりません。次の変更を試みました。

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

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

補遺:さらなる調査の後、カスタムアクセサーを追加する回避策は、NSPredicateを手動で使用しても問題なく機能しますが、コアデータでNSFe​​tchRequestを使用する場合はまったく機能しません。

64
Brian Webster

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

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

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

87
Alfonso

答えは次のとおりです。

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

文字列比較はデフォルトで大文字と小文字を区別し、発音区別記号を区別します。角カッコ内のキー文字cおよびdを使用して演算子を変更し、大文字と小文字の区別を区別することができます(firstName BEGINSWITH [cd] $ FIRST_NAMEなど)。

述語フォーマット文字列構文

49
slatvick

大文字と小文字を区別せずに等しい名前のみをキャッチしようとしている場合、私はそれが最良の解決策だと思います

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

あなたは私をたくさん助けてくれました。みんなありがとう!!!

私の場合、私はやった:

[NSPredicate predicateWithFormat:@"ANY name LIKE[c] %@", @"teste"];
13
wal

キーワードと一致しなければならないが、大文字と小文字を区別して検索する必要がある場合-in sensitiveの場合、NSPredicate(format: "keywords.name =[c] %@", self.searchString)を使用する必要があります

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

6
netshark1000

大文字と小文字を区別せず、ワイルドカードが必要な場合は、これを使用します。

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