0

状況: 「連絡先」エンティティと「合計」属性 (正または負または 0) を持つ CoreData データベース

目標: 3 つのセクションを持つ tableviewcontroller、1 番目の正の 2 番目の負の 3 番目 (ゼロ) "ARCHIVED"

これまでのところ: @selector(compare:) で記述子を並べ替えます (すべての連絡先のリストが必要なため、述語なし)

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Contact"];

request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"moneySum" ascending:YES selector:@selector(compare:)]];
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
                                                                    managedObjectContext:self.database.managedObjectContext
                                                                      sectionNameKeyPath:@"sectionName"
                                                                               cacheName:nil];

連絡先エンティティのカテゴリ:

- (NSString *)sectionName {

    [self willAccessValueForKey:@"sectionName"];
    NSString *sectionName;
    double value = [[self valueForKey:@"moneySum"] doubleValue];

    if      (value > 0) sectionName = POS_SECTION;
    else if (value < 0) sectionName = NEG_SECTION;
    else                sectionName = ARCHIVE_SECTION;

    [self didAccessValueForKey:@"sectionName"];
    return sectionName;
}

私は今3つのカテゴリを取得していますが、明らかにアーカイブを最後ではなく真ん中に並べ替えています.

sortDescriptors 配列に 2 番目の sortDescriptor を追加することを考えました (比較前: one) が、私にとって最も直感的な方法 (isEqualToNumber:) は、引数を指定できないため (@selector ( ..:) ) 明らかに機能しません。または私は間違っていますか?

申し訳ありませんが、このコーディング全体にはまったく新しいものです:)

4

1 に答える 1

1

「コアデータプログラミングガイド」から:

... 要約すると、ただし、フェッチを直接実行する場合は、通常、Objective-C ベースの述語またはソート記述子をフェッチ要求に追加しないでください。代わりに、これらをフェッチの結果に適用する必要があります。

これは、フェッチ リクエストでカスタム ソート記述子を使用できないことを意味します。追加の (非一時的な) 属性をエンティティに格納する必要があります。たとえば、正/負/ゼロの合計の場合は "0"、"1"、"2" です。

その後、この属性をソート記述子の両方に使用できsectionNameKeyPathます。一時的な属性「sectionName」は必要ありません。

次に、「0」、「1」、「2」から実際のセクション ヘッダーへのマッピングが で行われtableView:titleForHeaderInSection:ます。

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { 
    id <NSFetchedResultsSectionInfo> sectionInfo = [[self.controller sections] objectAtIndex:section];
    int order = [[sectionInfo name] intValue];
    if (order == 0)
        return @"POSITIVE SECTION";
    else if (order == 1)
        return @"NEGATIVE SECTION";
    else
        return @"ARCHIVE SECTION";
}
于 2012-08-17T13:03:56.803 に答える