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也是以某种方式排序的吗?我将写它作为一个答案。。。