65 votes

NSPredicate insensible à la casse sur plusieurs relations

Je suis la mise en œuvre d'un champ de recherche où l'utilisateur peut entrer dans une chaîne de filtrer les éléments affichés dans une vue. Chaque objet a affiché un keywords -beaucoup de relation, et je voudrais être en mesure de filtrer les objets sur la base des mots-clés. Chaque mot-clé objet a un name de la propriété, de sorte que j'ai mis en place un NSPredicate de faire le filtrage qui ressemble à ceci:

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

Cela fonctionne, mais le problème est que la recherche est sensible à la casse, donc, si le mot a un capital de lettre, mais les types d'utilisateur en minuscules, aucune correspondance n'est trouvée. J'ai essayé la modification suivante:

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

Mais cela ne fait aucune différence dans le cas de la sensibilité de l'appariement. Est-il un moyen de faire cette comparaison insensible à la casse en utilisant simplement un simple prédicat? Ou ai-je besoin pour mettre en œuvre une sorte de coutume accesseur sur le mot-clé class, par exemple, écrire un lowercaseName méthode et un match contre un lowercase version de la chaîne de recherche à la place?

Addendum: Après l'exploration en outre, la solution de contournement de l'ajout d'un personnalisé accesseur fonctionne bien pour une utilisation manuelle du NSPredicate, mais ne fonctionne pas du tout lors de l'utilisation de NSFetchRequest avec Base de Données, qui ne fonctionne que lors de l'interrogation des attributs définis dans la Base de Données du modèle.

88voto

Fönsi Points 4573

Si je vous comprends bien, vous voulez que votre prédicat pour être vrai à chaque fois que les mots-clés nom correspond à la chaîne de recherche. Pour cela, vous avez besoin de tester avec le mot-clé comme ceci:

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

Cela va rechercher les mots-clés et retourne true si l'un de ces mots-clés nom contient votre chaîne de recherche.

49voto

slatvick Points 901

Je crois que la réponse est:

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

Les comparaisons de chaînes sont par cas par défaut et diacritiques sensibles. Vous pouvez modifier un opérateur à l'aide de la clé de caractères c et d à l'intérieur des crochets pour spécifier cas et diacritiques insensibilité, respectivement, par exemple prénom BEGINSWITH[cd] $PRENOM.

Prédicat Format Syntaxe De La Chaîne De

13voto

wal Points 1290

Si vous avez essaye d'attraper seulement les égaux des noms, mais avec insensibles cas, je pense que c'est la meilleure solution

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

Vous m'a beaucoup aidé. Merci les gars!!!

Dans mon cas j'ai fait:

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

1voto

Sven Points 879

Si vous souhaitez à la fois insensible à la casse et générique, utilisez ceci:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X