65 votes

Données de base: NSPredicate pour une relation plusieurs à plusieurs. ("clé multiple interdite ici")

J'ai deux entités nommées "Catégorie" et "Article" qui ont une relation plusieurs à plusieurs. Je veux former un prédicat qui recherche tous les articles où category.name est égal à une valeur. J'ai le suivant:

  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];
 

L'erreur que je reçois est *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

Existe-t-il des options pour récupérer les données souhaitées?

157voto

Dave DeLong Points 156978

Vous essayez de comparer une collection ( categories.name ) à une valeur scalaire ( category.name ). Vous devez utiliser un comparateur de collection ( CONTAINS ) ou un modificateur de prédicat ( ANY - ALL - SOME , etc.). .

Essayez d'utiliser:

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

Ou:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X