many relationship using a NSFetchedResultsController

I'm trying to use the NSFetchedResultsController in my app, but have a problem to sort my data. I get the following error when trying to sort the result using a relationship that is two levels down from the entity:

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here'

My data model is set up this way:

Item <<---> Category <--->> SortOrder <<---> Store

In other words: Each item belongs to one category. Categories can have different sort orders for each store that includes a certain category.

So, I'm creating a fetch request to find all items for a certain store and would like to present the result using category names as sections, and sorted on the sort order.

When I perform the the fetch (last line below), I get the above error.

 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]; 

If I change the sorting to, say, category names, it works.

 NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"category.name" ascending:YES];

How can I get the NSSortDescriptor to sort on the sort order?

UPDATE: So it seems this is not possible. I got a suggestion to create a transient property and sort on that, but Apple documentation clearly states

You cannot fetch using a predicate based on transient properties

My conclusion here is that I cannot use NSFetchedResultsController out of the box. I need to either access the array of objects the NSFetchResultsController gives me and sort in memory, or setup my own fetch requests and skip NSFetchedResultsController.


iOS 5 provide now ordered relationships

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

UPDATE: Link updated

Reference : "Core Data Release Notes for OS X v10.7 and iOS 5.0"

链接地址: http://www.djcxy.com/p/36140.html

上一篇: 使用to对依赖属性排序NSFetchRequest

下一篇: 许多关系使用NSFetchedResultsController