J'essaie d'utiliser le NSFetchedResultsController
dans mon application, mais j'ai un problème pour trier mes données. Je reçois l'erreur suivante en essayant de trier les résultats en utilisant une relation qui est deux niveaux vers le bas de l'entité:Trier sur la relation to-many en utilisant un NSFetchedResultsController
* Mettre fin application en raison d'une exception non interceptée « NSInvalidArgumentException », raison: « à plusieurs clé non autorisée ici »
Mon modèle de données est configuré de cette manière:
article < < ---> Catégorie < --- >> SortOrder < < ---> Magasin
En d'autres termes: Chaque élément appartient à une catégorie. Les catégories peuvent avoir des ordres de tri différents pour chaque magasin qui inclut une certaine catégorie.
Donc, je crée une requête d'extraction pour trouver tous les éléments pour un certain magasin et je voudrais présenter le résultat en utilisant les noms de catégories comme des sections, et triés sur l'ordre de tri.
Lorsque j'effectue le fetch (dernière ligne ci-dessous), j'obtiens l'erreur ci-dessus.
NSManagedObjectContext* context = [appDelegate managedObjectContext];
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(status != %d) AND (ANY category.sort.include == YES) AND (ANY category.sort.store == %@)", ItemStatusDefault, store];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Item" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
[fetchRequest setPredicate:predicate];
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.sort.order" ascending:YES];
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[fetchRequest setSortDescriptors:sortDescriptors];
[sortDescriptors release];
[sortDescriptor release];
self.resultsController = [[NSFetchedResultsController alloc]
initWithFetchRequest:fetchRequest
managedObjectContext:context
sectionNameKeyPath:@"category.name"
cacheName:nil];
[fetchRequest release];
NSError *error;
BOOL success = [self.resultsController performFetch:&error];
Si je change le tri par, disons, les noms de catégories, cela fonctionne.
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];
Comment puis-je obtenir le NSSortDescriptor
pour trier l'ordre de tri?
MISE À JOUR: Il semble donc que ce n'est pas possible. Je suis une suggestion de créer une propriété transitoire et trier, mais Apple documentation clearly states
Vous ne pouvez pas chercher l'aide d'un prédicat en fonction des propriétés transitoires
Ma conclusion est que je ne peux pas utiliser NSFetchedResultsController sur la boîte. J'ai besoin soit d'accéder au tableau d'objets que le NSFetchResultsController me donne et de trier en mémoire, soit de configurer mes propres requêtes de recherche et d'ignorer NSFetchedResultsController.
je crois nous avons le même problème: http://stackoverflow.com/questions/3943572/sorting-a-to-many-relationship-when-calling-nsfetchrequest – elcool