J'ai une entité Group qui contient plusieurs entités Item. Une entité Item peut être dans plusieurs groupes. La partie pertinente de mon modèle ressemble à ceci:Comment configurer un NSPredicate qui filtre les éléments d'un groupe spécifié à l'aide de NSFetchedResultsController
Le problème
Quand j'appelle
[fetchedResultsController performFetch:&error]
Je reçois cette erreur de la console
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here' ***
Je suis assez su re le problème est dans la façon dont je suis la mise en place du prédicat ici:
[NSPredicate predicateWithFormat:@"groups == %@", self.group];
Mais je ne peux pas dire ce que je fais mal. J'ai lu les documents NSPredicate et j'ai essayé ceci:
[NSPredicate predicateWithFormat:@"ANY groups IN %@", [NSArray arrayWithObject:self.group]];
[NSPredicate predicateWithFormat:@"ANY groups LIKE %@", self.group];
[NSPredicate predicateWithFormat:@"ANY groups == %@", self.group];
[NSPredicate predicateWithFormat:@"ANY groups IN %@", [NSArray arrayWithObject:self.group]];
[NSPredicate predicateWithFormat:@"groups == %@", self.group];
Aucune de ces méthodes ne fonctionne. Cela doit être simple, mais je ne peux pas le comprendre. Je veux simplement que le prédicat filtre tous les éléments afin de ne renvoyer que les éléments qui sont membres (via la relation de modèle) du groupe. Comment est-ce que tu fais ça?
J'ai un NSFetchedResultsController que j'essaye de configurer pour montrer seulement les articles dans un groupe spécifique. Mon code pour installer le NSFetchedResultsController ressemble à ceci:
// create the fetch request
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// configure the entity
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
// configure the predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"groups == %@", self.group];
[fetchRequest setPredicate:predicate];
// configure the sort descriptors
NSSortDescriptor *indexSortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"uniqueID" ascending:YES];
NSArray *sortDescriptors = [NSArray arrayWithObject:indexSortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
// create the fetched results controller
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"ItemsCache"];
// configure the fetched results controller
aFetchedResultsController.delegate = self;
J'avais l'habitude de manipuler la relation plusieurs-à-plusieurs en brisant la relation par une autre entité. Peut être la question suivante montre comment je l'ai fait. http://stackoverflow.com/questions/2822625/core-data-many-to-many-relationship-nspredicate Vous pouvez également utiliser l'éditeur de prédicat de l'éditeur de modèle de données pour construire le prédicat. J'espère que cela vous aide, – Sarah
Le rappel sur l'éditeur de prédicat a été utile. Je n'ai toujours pas encore compris, mais merci! –