web-dev-qa-db-fra.com

Données de base: NSPredicate pour une relation plusieurs-à-plusieurs. ("clé to-many non autorisée 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 ce qui suit:

 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?

63
Oh Danny Boy

Vous essayez de comparer une collection (categories.name) à une valeur scalaire (category.name). Vous devez soit utiliser un comparateur de collection (CONTAINS), soit utiliser 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];
148
Dave DeLong

Swift SYNTAX

Au cas où quelqu'un arriverait lors de cette écriture en Swift comme je l'ai fait ...

let predicate = NSPredicate(format: "ANY categories.name = %@", category.name!)
fetchRequest.predicate = predicate

travaillé pour moi.

1
caleb81389