我正在使用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];
}
以上内容应如下所示:
正如您所看到的,联系人组“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;
}
答案 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 属性显示为节标题。