MagicalRecord NSFetchesResultsController部分分组和排序+内部也是如此

时间:2013-01-22 14:59:32

标签: ios core-data nsfetchedresultscontroller magicalrecord

我正在使用MagicalRecord为表创建NSFetchedResultsController

我的NSManagedObjects包含了一组人,这里有两个例子:

ContactGroup *everyoneContactGroup = [ContactGroup findFirstByAttribute:@"groupId" withValue:@"<GROUPID>"];
if (!everyoneContactGroup) {
    everyoneContactGroup = [ContactGroup createEntity];
    [everyoneContactGroup setGroupId:@"<GROUPID>"];
    [everyoneContactGroup setGroupName:@"Everyone"];
    [everyoneContactGroup setGroupSortOrder:@1]; // sort order within section
    [everyoneContactGroup setGroupType:@1];
    [everyoneContactGroup setGroupTypeName:@"Smart Groups"];
    [everyoneContactGroup setGroupTypeSortOrder:@0]; // sort order for groups
}

ContactGroup *closeFriendsContactGroup = [ContactGroup findFirstByAttribute:@"groupId" withValue:@"<GROUPIDCLOSEFRIENDS>"];
if (!closeFriendsContactGroup) {
    closeFriendsContactGroup = [ContactGroup createEntity];
    [closeFriendsContactGroup setGroupId:@"<GROUPIDCLOSEFRIENDS>"];
    [closeFriendsContactGroup setGroupName:@"Close Friends"];
    [closeFriendsContactGroup setGroupSortOrder:@2];
    [closeFriendsContactGroup setGroupType:@2];
    [closeFriendsContactGroup setGroupTypeName:@"Custom Groups"];
    [closeFriendsContactGroup setGroupTypeSortOrder:@10];
}

ContactGroup *familyContactGroup = [ContactGroup findFirstByAttribute:@"groupId" withValue:@"<GROUPIDFAMILY>"];
if (!familyContactGroup) {
    familyContactGroup = [ContactGroup createEntity];
    [familyContactGroup setGroupId:@"<GROUPIDFAMILY>"];
    [familyContactGroup setGroupName:@"Family"];
    [familyContactGroup setGroupSortOrder:@1];
    [familyContactGroup setGroupType:@2];
    [familyContactGroup setGroupTypeName:@"Custom Groups"];
    [familyContactGroup setGroupTypeSortOrder:@10];
}

以上内容应如下所示:

enter image description here

正如您所看到的,联系人组“Everyone”应该被分组为自己的一部分,并且应该按照组的顺序显示为第一组。

上面的第二个和第三个联系人组应该被分组到一个部分中,而这个部分应该出现在另一个部分的下面,其中有一个组。在此组(“自定义组”)中,每个联系人组应按其groupSortOrder进行排序。

这是我的NSFetchedResultsController代码:

- (NSFetchedResultsController *)fetchedResultsController {
    if (!fetchedResultsController) {
        fetchedResultsController = [ContactGroup fetchAllSortedBy:@"groupTypeSortOrder,groupSortOrder"
                                                           ascending:YES
                                                       withPredicate:nil
                                                             groupBy:@"groupTypeName"
                                                            delegate:self];
    }
    return fetchedResultsController;
}

我尝试了各种组合,但无法为每个表视图部分(联系人组)和每个表视图部分中获取排序顺序。我知道你可以添加逗号分隔的排序属性,但我无法正确组合。任何人都知道是否有可能用MagicalRecord实现我想要的东西,或者我是否需要滚动一些非MR代码。

提前感谢任何输入和帮助!

更新

这是由Core Data生成的SQL:

CoreData: sql: 
SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZGROUPID,  t0.ZGROUPNAME, t0.ZGROUPSORTORDER, 
t0.ZGROUPTYPE, t0.ZGROUPTYPENAME, t0.ZGROUPTYPESORTORDER 
FROM ZTCONTACTGROUP t0 
ORDER BY t0.ZGROUPTYPESORTORDER, t0.ZGROUPSORTORDER

更新

所以我尝试按groupTypeSortOrder进行分组,现在它正常工作。但是,我不能正确显示部分名称,因为它会显示groupTypeSortOrder的数字。有什么想法吗?

- (NSFetchedResultsController *)fetchedResultsController {
    if (!fetchedResultsController) {
        fetchedResultsController = [ContactGroup fetchAllSortedBy:@"groupTypeSortOrder,groupSortOrder"
                                                           ascending:YES
                                                       withPredicate:nil
                                                             groupBy:@"groupTypeSortOrder"
                                                            delegate:self];
    }
    return fetchedResultsController;
}

1 个答案:

答案 0 :(得分:3)

我还没有使用过MagicalRecord,但我认为groupBy:参数对应sectionNameKeyPath:的{​​{1}}参数。

如果将键指定为NSFetchedResultsController,则获取请求必须具有使用相同键的第一个排序描述符(或生成相同相对排序的键)。

因此,使用 groupTypeSortOrder 作为第一个排序键和sectionNameKeyPath参数是正确的方法。

现在,要显示组名而不是数字作为节标题,您可以修改groupBy:方法,通常如下所示:

titleForHeaderInSection

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section]; return [sectionInfo name]; } groupTypeSortOrder 的值,因为它已被指定为[sectionInfo name](或sectionNameKeyPath)。如果你修改这样的方法:

groupBy

groupName 属性显示为节标题。