2010-04-29 5 views
47

Estoy buscando una forma de usar NSPredicate para establecer una condición LIKE para recuperar objetos. Además de eso, un OR sería útil también. Estoy tratando de hacer algo en la que si un usuario busca "James" Soy capaz de escribir un NSPredicate que hará el equivalente de:NSPredicate que es el equivalente de SQL's LIKE

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

Respuesta

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

¿Qué quiere decir '[cd]'? No puedo encontrar esto en los documentos. –

+26

Encontrado! Significa Case & Diacritic insensible –

+1

@AlexReynolds ¿por qué no utilizas LIKE? – onmyway133

35

El operador CONTAINS sin duda funcionará bien. Si usted está buscando una correlación más directa, a continuación, también se puede utilizar el operador LIKE (* = 0 o más caracteres, ? = 1 carácter):

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

Como referencia:
https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-215868

+6

Sé que eso fue hace mucho tiempo, pero esto no funciona, ya que NSPredicate no sustituye el contenido entrecomillado '% @' se mantendrá '% @' ... –

+1

comienza con [c] lo hace por mí pero aún así, tiene cualquiera logró generar una consulta LIKE dinámica como '% @ *' –

+7

El truco para usar like es incluir las * marcas en el argumento. es decir: 'NSPredicate * predicate = [NSPredicate predicateWithFormat: @"% K LIKE [cd]% @ ", kMDItemDisplayName, [NSString stringWithFormat: @" *% @ * ", appname]];' –

9

otra posibilidad

@"firstname beginswith[c] James" 

Como una alternativa agradable contiene

A veces, contener no siempre es la respuesta correcta

+1

No coincide con "SuperJames" :) startswith no es igual a sql como '% foo%' – marsbear

Cuestiones relacionadas