47 votos

Datos básicos: NSPredicate para la relación muchos a muchos. ("to-many clave no puede estar aquí")

Tengo dos entidades denominadas "Categoría" y "Artículo" que tienen relación muchos a muchos. Quiero formar un predicado que busca todos los artículos donde category.name es igual a algún valor. Tengo lo siguiente:

 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'

¿Existe alguna opción para recuperar los datos deseados?

117voto

Dave DeLong Puntos 156978

Estás tratando de comparar una colección ( categories.name ) a un valor escalar ( category.name ). Tienes que usar un comparador de colección ( CONTAINS ), o utilizar 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];

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X