El predicado simple de iOS 'contiene' no funciona

Tengo un modelo:

lugar<--->>categoría

Al realizar la siguiente consulta:

NSFetchRequest *req = [NSFetchRequest fetchRequestWithEntityName:@"Category"];
if(![searchText isEqualToString:@""] && searchText != nil){
    req.predicate = [NSPredicate predicateWithFormat:@"(places.placeTitle contains %@) OR (places.details contains %@) OR (name contains %@)", searchText, searchText, searchText];
    NSLog(@"ModelHelper.getResults: Search text given, creating predicate: %@", req.predicate);
}
req.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name"
                                                                             ascending:YES
                                                                              selector:@selector(localizedCaseInsensitiveCompare:)]];
NSFetchedResultsController *controller = [[NSFetchedResultsController alloc]initWithFetchRequest:req
                                                                            managedObjectContext:context
                                                                              sectionNameKeyPath:nil
                                                                                       cacheName:nil];
NSError *error = nil;
[controller performFetch:&error];

Recibo coincidencias que no deberían estar ahí, por ejemplo:

searchText = "1234"

los primeros resultados son:

category[0].name = "Bars"
category[0].places[0].placeTitle = "Aaa"
category[0].places[0].details = "Aaa"
category[0].places[1].placeTitle = "123456"
category[0].places[1].details = "123456"
category[0].places[2].placeTitle = "test"
category[0].places[2].details = "test"

¿Hay algo que estoy haciendo mal con mi predicado? Gracias.

preguntado el 11 de abril de 13 a las 04:04

req.predicate = [NSPredicate predicateWithFormat:@"(places.placeTitle CONTAINS %@) OR (places.details CONTAINS %@) OR (name CONTAINS %@)", searchText, searchText, searchText]; -

1 Respuestas

Desde el documentación:

Importante: no debe modificar fetchRequest después de invocar este método. Por ejemplo, no debe cambiar su predicado o el orden de clasificación.

Mover este segmento:

if(![searchText isEqualToString:@""] && searchText != nil){
    req.predicate = [NSPredicate predicateWithFormat:@"(places.placeTitle contains[c] %@) OR (places.details contains[c] %@) OR (name contains[c] %@)", searchText, searchText, searchText];
    NSLog(@"ModelHelper.getResults: Search text given, creating predicate: %@", req.predicate);
}

Antes de inicializar el FRC

Respondido 11 Abr '13, 04:04

Gracias. Intenté cambiar como sugirió (como se muestra en el código actualizado anterior), pero sigo teniendo exactamente el mismo comportamiento. - quiero

Pero sus resultados coinciden con el predicado: lugares[2].placeTitle = "1234..." - dan shelly

Sí, los resultados contienen elementos que no coinciden. lugares[1] no tiene un título o detalles que coincidan con "1234". - quiero

Pero solicitó que la entidad de resultados fuera Category y la categoría de resultado responde al predicado - dan shelly

Entonces, ¿eso significa que devolverá todos los lugares que existen en una categoría, si uno de los lugares en la categoría coincide? ¿Cómo crearía una consulta que solo devuelva los resultados como una matriz de categorías que solo contengan lugares donde coincidan placeTitle o detalles? ¿Es eso posible con una sola consulta? Gracias. - quiero

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.