2011-02-14 9 views
10

En mi aplicación iOS tengo un predicado realmente simple para mi controlador de búsqueda.NSPredicar para la búsqueda de palabras múltiples

NSString *format = [NSString stringWithFormat:@"name like[c] '%@'", nameVar]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:format]; 
[fetchController setPredicate:predicate]; 

Realiza búsquedas básicas de nombres de mayúsculas y minúsculas. Ahora me gustaría cambiarlo para poder poner un número de palabras en el cuadro de búsqueda (nameVar tiene el valor del cuadro de búsqueda) separadas por espacios y hacer que el predicado filtre los resultados que coincidan con todas esas palabras clave.

Así que si tengo dos nombres: "John Smith" y "Mary Smith" y busco: "Smith M" Me gustaría tener un solo resultado, pero una búsqueda como esa: "Sm th ith" debería devuelve ambos valores

¿Alguien tiene una idea de cómo debe implementarse esto?

Respuesta

31

edición de nuevo en un ordenador normal ...

Así que hay un par de cosas a tener en cuenta:

  1. No es necesario poner comillas alrededor del marcador de posición de sustitución en su cadena de formato. Cuando el método está construyendo el predicado, va a crear un árbol de sintaxis abstracta de los objetos NSExpression y NSPredicate (específicamente NSComparisonPredicate y NSCompoundPredicate). Su cadena se colocará en un NSExpression de tipo NSConstantValueExpressionType, lo que significa que es ya que se interpretará como una cadena normal. Colocar las comillas simples en la cadena de formato, de hecho, hará que su predicado no sea funcional.
  2. No está limitado a una sola comparación en un predicado. Por lo que dice, desea tener tantas comparaciones como "palabras" en su cadena de búsqueda (nameVar). En ese caso, dividiremos el nameVar en sus palabras constitutivas y crearemos una comparación para cada palabra. Una vez que hayamos hecho eso, los AND juntos para crear un único predicado global. El código a continuación hace exactamente eso.

respuesta original

Usted puede hacer esto mediante la construcción de su propia NSCompoundPredicate:

NSString *nameVar = ...; //ex: smith m 
NSArray *names = ...; //ex: John Smith, Mary Smith 

NSArray *terms = [nameVar componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; 
NSMutableArray *subpredicates = [NSMutableArray array]; 

for(NSString *term in terms) { 
    if([term length] == 0) { continue; } 
    NSPredicate *p = [NSPredicate predicateWithFormat:@"name contains[cd] %@", term]; 
    [subpredicates addObject:p]; 
} 

NSPredicate *filter = [NSCompoundPredicate andPredicateWithSubpredicates:subpredicates]; 
[fetchController setPredicate:filter]; 

Advertencia: mecanografiado en un navegador en mi iPhone.

+0

Entonces, después de ejecutar este código, ¿dónde puedo encontrar mis resultados? subpredicates? Soy principiante en el desarrollo de iOS, lo siento si la pregunta es estúpida :) –

Cuestiones relacionadas