2010-11-18 21 views
58

Tengo dos entidades llamadas "Categoría" y "Artículo" que tienen una relación de muchos a muchos. Quiero formar un predicado que busque todos los artículos donde categoría.nombre sea igual a algún valor. Tengo el siguiente:Datos principales: NSPredicar para la relación de muchos a muchos. ("clave to-many no permitida aquí")

NSEntityDescription *entityArticle = [NSEntityDescription entityForName:@"Article" inManagedObjectContext:managedObjectContext]; 
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES]; 
NSArray  *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"categories.name == [cd] %@", category.name]; 

[request setSortDescriptors:sortDescriptors]; 
[request setEntity:entityArticle]; 
[request setPredicate:predicate]; 

NSMutableArray *results = [[managedObjectContext executeFetchRequest:request error:nil] mutableCopy]; 

if ([results count] > 0) 
    NSLog(@"Results found."); 
else 
    NSLog(@"NO results found."); 

[request release]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

El error que recibo es *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

¿Hay algunas opciones para recuperar los datos deseados?

+0

una sub consulta también puede ser lo que necesita. Ver: http://stackoverflow.com/questions/11346546/core-data-unsupported-predicate-with-all-and-in – Collin

Respuesta

136

Está tratando de comparar una colección (categories.name) a un valor escalar (category.name). Necesita utilizar un comparador de colecciones (CONTAINS) o usar un modificador de predicado (ANY/ALL/SOME, etc.).

Trate de usar:

[NSPredicate predicateWithFormat:@"ANY categories.name =[cd] %@", category.name]; 

O:

[NSPredicate predicateWithFormat:@"categories.name CONTAINS[cd] %@", category.name]; 
+0

Esto funciona para mí, tanto con como sin '[cd]'. ¿Puedes elaborar sobre la función de eso? –

+15

@DuncanBabbage '[cd]' significa hacer una búsqueda insensible a mayúsculas y minúsculas (la 'c') y una insensible a diacríticas (la' d'). –

+2

No funciona si 'category' tiene una relación inversa' to one' con 'Article'. ¿Alguna idea de cómo predicar eso? – iEngineer

Cuestiones relacionadas