4

コアデータを使用する小さなアプリを作成しています。数学、科学、その他の本を含む科目のようなデータがあります。

他の本は追加または削除できますが、数学と科学は削除できません。新しい生徒が追加されると、デフォルトで追加されます。結果を取得すると、数学と科学を含むすべての本の名前を取得する必要があります。

私がしたいのは、Maths、Science、およびOthersのヘッダーを持つ3つのセクションにデータを表示することです。Maths and science には、math または science の 1 行のみが含まれます。そして、他のすべての本は読書セクションにあるべきです。

これを達成するにはどうすればよいですか?

4

1 に答える 1

4

NSFetchResultsController を作成するときは、フェッチ リクエストで book テーブルのエンティティ名を使用します。

じゃあこれ使って…

NSFetchedResultsController *aController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"typePropertyName" cacheName:nil];

typePropertyName は、本からその本が含まれるセクションの名前へのパスになります。

Book テーブルに直接ある場合は @"typeName" にするか、@"type.name" という名前のテーブルとの関係がtypeあり、そのテーブルに というフィールドがある場合は、単に @"typeName" にすることができますname

とにかく、セクションを含む NSFetchedResultsController が作成されます...

完全なコードは次のようになります...

#pragma mark - fetched results controller

- (NSFetchedResultsController*)fetchedResultsController
{
    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Book"];
    [request setFetchBatchSize:20];

    NSSortDescriptor *sdType = [[NSSortDescriptor alloc] initWithKey:@"type.name" ascending:YES];
    NSSortDescriptor *sdName = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    [request setSortDescriptors:@[sdType, sdName]];

    NSFetchedResultsController *aController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"type.name" cacheName:nil];

    aController.delegate = self;
    self.fetchedResultsController = aController;

    NSError *error = nil;
    if (![self.fetchedResultsController performFetch:&error]) {
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }
    return _fetchedResultsController;
}

次に、tableViewController でこれを使用できます...

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

    return [sectionInfo name]
}

これにより、セクション名が各セクションのヘッダーとして使用されます。

于 2012-11-29T09:02:37.140 に答える