2

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.

+0

je crois nous avons le même problème: http://stackoverflow.com/questions/3943572/sorting-a-to-many-relationship-when-calling-nsfetchrequest – elcool

Répondre

-1

iOS 5 offrent maintenant des relations ordonné

https://developer.apple.com/LIBRARY/ios/releasenotes/DataManagement/RN-CoreData/index.html

MISE À JOUR: Lien mis à jour

Référence: "Notes de version de base de données pour OS X v10.7 et iOS 5.0"

+0

Pouvez-vous l'utiliser avec 'NSFetchedResultsController'? – VietHung

+0

lien est mort, vous devriez toujours poster la réponse avec une référence au lien. – lostintranslation

+0

non vous ne pouvez pas l'utiliser avec 'NSFetchedResultsController'! – Stephan