iOS:对NSFetchedResultsController进行排序和分组

时间:2013-12-28 08:33:18

标签: ios nsfetchedresultscontroller

我有两个具有以下结构的表

MainCategory:

name position hasSubCategories

子类别:

name position display belongsToMainCategory

现在我想显示按主类别分组的所有子类别(其中display attribute = YES)。主要类别部分应按位置和子类别本身(在部分内)按其位置属性进行排序。 (顺便说一下,某个主要类别的名称相同...我的表格有更多属性,但它们与理解问题无关)。 但我的订单完全搞砸了。为什么?这是我的FetchedResultsController的代码:

    NSError *error = nil;
    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SubCategory"];

    NSSortDescriptor *mainCatPosition = [[NSSortDescriptor alloc]
                            initWithKey:@"belongsToMainCategory.position" ascending:YES];
    NSSortDescriptor *subCatPosition = [[NSSortDescriptor alloc]
                            initWithKey:@"position" ascending:YES];

    request.sortDescriptors = [NSArray arrayWithObjects:mainCatPosition,subCatPosition,nil];
    request.predicate = [NSPredicate predicateWithFormat:@"display = %@", [NSNumber numberWithBool:YES]];
    [self.db.managedObjectContext executeFetchRequest:request error:&error];

    self.fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:request
                                                                       managedObjectContext:self.budgetDatabase.managedObjectContext
                                                                         sectionNameKeyPath:@"belongsToMainCategory.name"
                                                                                  cacheName:nil];

1 个答案:

答案 0 :(得分:5)

用作获取结果控制器的sectionNameKeyPath:参数的密钥路径必须 与第一个排序描述符中使用的密钥相同,生成相同的相对排序。

获取的结果控制器首先根据第一个对所有获取的对象进行排序 排序描述符,然后根据sectionNameKeyPath将对象分组为多个部分。因此,使用不同的键路径(如在您的情况下“belongsToMainCategory.position”与“belongsToMainCategory.name”)不起作用。 这甚至可能导致关于“乱序部分”的运行时错误。