2

MagicalRecordテーブルのを作成するために使用しNSFetchedResultsControllerています。

私はNSManagedObjects人々のグループを含んでいます、ここに2つの例があります:

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」は独自のセクションにグループ化され、グループの順序で最初のグループとして表示されます。

上記の2番目と3番目の連絡先グループは、一緒にセクションにグループ化する必要があります。このセクションは、1つのグループが含まれる他のセクションの下に表示されます。このグループ(「カスタムグループ」)内では、各連絡先グループを。で並べ替える必要がありますgroupSortOrder

これが私のNSFetchedResultsControllerコードです:

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

さまざまな組み合わせを試しましたが、各テーブルビューセクション(連絡先グループのグループ)と各テーブルビューセクション内の両方で並べ替え順序を取得できません。カンマ区切りの並べ替え属性を追加できることは知っていますが、組み合わせを正しく行うことができません。MagicalRecordで私が望むことを達成できるかどうか、またはMR以外のコードをロールする必要があるかどうかは誰でも知っています。

ご意見やご協力をよろしくお願いいたします。

アップデート:

CoreDataによって生成される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;
}
4

1 に答える 1

3

MagicalRecordはまだ使用していませんが、パラメーターがのパラメーターgroupBy:に対応していると思います。sectionNameKeyPath:NSFetchedResultsController

キーがとして指定されている場合sectionNameKeyPath、フェッチ要求には、同じキー(または同じ相対順序を生成するキー)を使用する最初のソート記述子が必要です。

したがって、groupTypeSortOrderを最初のソートキーおよびgroupBy:パラメーターとして使用するのが正しい方法です。

ここで、セクションヘッダーとして番号の代わりにグループ名を表示するために、titleForHeaderInSectionメソッドを変更できます。これは通常、次のようになります。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    return [sectionInfo name];
}

ただし、 (または)として指定されているため、 groupTypeSortOrder[sectionInfo name]の値です。このようにメソッドを変更した場合:sectionNameKeyPathgroupBy

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    return [[[sectionInfo objects] objectAtIndex:0] groupName];
}

groupName属性は、代わりにセクションヘッダーとして表示されます。

于 2013-01-22T18:51:07.013 に答える