2010-04-29 2 views
47

Je cherche un moyen d'utiliser NSPredicate pour définir une condition LIKE pour récupérer des objets. En plus de cela, un OR serait utile aussi bien. Je suis en train de faire quelque chose où si un utilisateur recherche « James » Je peux écrire un NSPredicate qui fera l'équivalent de:NSPredicate qui est l'équivalent de SQL LIKE

select * from users where firstname LIKE '%James%' OR lastname LIKE '%James%'; 

Répondre

109
NSString *_mySearchKey = @"James"; 
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"(firstname CONTAINS[cd] %@) OR (lastname CONTAINS[cd] %@)", _mySearchKey, _mySearchKey]; 
+2

Que signifie le '[cd]'? Je ne peux pas trouver cela dans les docs. –

+26

Trouvé! Cela signifie Case & Diacritic insensible –

+1

@AlexReynolds pourquoi n'utilisez-vous pas comme? – onmyway133

35

L'opérateur CONTAINS vais certainement travailler très bien. Si vous cherchez une corrélation plus directe, vous pouvez également utiliser l'opérateur LIKE (* = 0 ou plusieurs caractères, ? = 1 caractère):

NSString *_mySearchKey = @"James"; 
NSPredicate *_myPredicate = [NSPredicate predicateWithFormat:@"firstname LIKE '*%[email protected]*' OR lastname LIKE '*%[email protected]*'", _mySearchKey]; 

Pour référence:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215868

+6

Je sais que c'est il y a longtemps, mais cela ne marche pas, puisque NSPredicate ne remplace pas le contenu cité '% @' restera '% @' ... –

+1

commence par [c] le fait pour moi mais encore, a Quelqu'un a réussi à générer une requête LIKE dynamique telle que '% @ *' –

+7

L'astuce pour utiliser like est d'inclure les marques * dans l'argument. ie: 'NSPredicate * prédicat = [NSPredicate predicateWithFormat: @"% K LIKE [cd]% @ ", kMDItemDisplayName, [NSString stringWithFormat: @" *% @ * ", appname]];' –

9

une autre possibilité

@"firstname beginswith[c] James" 

Comme une bonne alternative à contient

Parfois, ce n'est pas toujours la bonne réponse

+1

Ne correspond pas à "SuperJames" :) beginwith n'est pas égal à sql est comme '% foo%' – marsbear