2010-08-05 3 views
5

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

alt text

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; 
+1

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

+0

Le rappel sur l'éditeur de prédicat a été utile. Je n'ai toujours pas encore compris, mais merci! –

Répondre

6

Sans avoir à jouer avec le code, il est difficile d'être à 100%, mais vous devriez être en mesure de:

[NSPredicate predicateWithFormat:@"%@ in groups", [self group]]; 

Cela suppose que votre fetch tente de retirer des entités de l'article.

+0

Génial! C'était ça! Merci Marcus. C'est tout à fait logique maintenant que je le vois. –

1

Votre retour en arrière. Puisque vous semblez avoir déjà le groupe (je suppose que self.group est un objet Group), vous devriez juste demander self.group pour ses articles en utilisant self.group.items. Une fois que vous avez les objets Item liés à un objet particulier Group alors vous pouvez les trier pour l'affichage que vous souhaitez.

+0

Je comprends cela, et si j'étais sur Mac, c'est exactement ce que je ferais, mais je suis sur l'iPhone et le NSFetchedResultsController offre de réels avantages, alors j'aimerais l'utiliser. C'est le cœur de la question: Comment utiliser NSFetchedResultsController étant donné cette configuration de modèle. –

Questions connexes