使用NSFetchedResultsController对多对多关系进行排序

时间:2010-10-05 10:59:16

标签: iphone cocoa-touch core-data nsfetchedresultscontroller nssortdescriptor

我正在尝试在我的应用中使用NSFetchedResultsController,但在排序数据时遇到问题。尝试使用与实体相差两级的关系对结果进行排序时出现以下错误:

  

* 由于未捕获的异常而终止应用   'NSInvalidArgumentException',原因:   “这里不允许使用许多密钥”

我的数据模型以这种方式设置:

  

项目<< --->类别< --->>排序   << --->店

换句话说:每个项目属于一个类别。对于包含特定类别的每个商店,类别可以有不同的排序顺序。

所以,我正在创建一个获取请求来查找某个商店的所有商品,并希望使用类别名称作为部分显示结果,并按排序顺序排序。

当我执行获取时(下面的最后一行),我得到上述错误。

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

如果我将排序更改为类别名称,则可以正常工作。

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

如何让NSSortDescriptor对排序顺序进行排序?

更新: 所以这似乎是不可能的。我有一个建议来创建一个瞬态属性并对其进行排序,但是Apple documentation clearly states

  

您无法使用谓词进行提取   基于瞬态属性

我的结论是我无法使用NSFetchedResultsController开箱即用。我需要访问NSFetchResultsController给我的对象数组并在内存中排序,或者设置我自己的获取请求并跳过NSFetchedResultsController。

1 个答案:

答案 0 :(得分:-1)

iOS 5现在提供有序关系

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

更新: 链接已更新

参考:“OS X v10.7和iOS 5.0的核心数据发行说明”