iOS:对NSFetchedResultsController进行排序和分组

iOS:对NSFetchedResultsController进行排序和分组,ios,nsfetchedresultscontroller,Ios,Nsfetchedresultscontroller,我有两张结构如下的表 主要类别: name position hasSubCategories 子类别: name position display belongsToMainCategory 现在我想显示按主类别分组的所有子类别(其中display attribute=YES)。主类别部分应按位置进行排序,子类别本身(在部分内)应按其位置属性进行排序。(顺便说一句,某个主类别的名称可以相同……我的表有更多属性,但它们与理解问题无关)。 但我点的菜全乱了。为什么?以下是我的FetchedRe

我有两张结构如下的表

主要类别:

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

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

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

用作获取结果控制器的
节名KeyPath:
参数的键路径必须 与第一个排序描述符中使用的键相同,或生成相同的相对顺序

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

可以显示一个(小)示例,说明您得到了什么以及您期望得到什么?此时,部分被混淆了。这些部分是按字母顺序排列的(这是错误的,它们应该按照belongToMingCategory.position排列),并且部分中的行数也是按字母顺序排列的,这也是错误的。但是,子类别是根据位置正确排序的。因此,整个主类别部分的排序错误,尤其是由于每个部分中的行数错误,所有子类别都错误地分配到主类别。sectionNameKeyPath必须与第一个排序描述符“兼容”。
sectionNameKeyPath:@“belongToMingCategory.position”
是否给出了预期的结果?是否可以有多个名称不同但位置相同的类别?是的!那是属于门类的。这个位置有效!非常感谢!!但是为什么呢?这个sectionNameKeyPath也是以某种方式排序的吗?我将把它作为一个答案来写…可以显示一个(小)示例,说明您得到了什么和您期望得到什么?目前,部分是混合的。这些部分是按字母顺序排列的(这是错误的,它们应该按照belongToMingCategory.position排列),并且部分中的行数也是按字母顺序排列的,这也是错误的。但是,子类别是根据位置正确排序的。因此,整个主类别部分的排序错误,尤其是由于每个部分中的行数错误,所有子类别都错误地分配到主类别。sectionNameKeyPath必须与第一个排序描述符“兼容”。
sectionNameKeyPath:@“belongToMingCategory.position”
是否给出了预期的结果?是否可以有多个名称不同但位置相同的类别?是的!那是属于门类的。这个位置有效!非常感谢!!但是为什么呢?这个sectionNameKeyPath也是以某种方式排序的吗?我将写它作为一个答案。。。