带有节的FetchedResultsController

时间:2012-11-29 08:40:49

标签: ios nsfetchedresultscontroller

我正在编写一个小应用程序,其中我使用coredata,我有包含主题的数据 数学,科学和其他书籍。

可以添加或删除其他书籍,但无法删除数学和科学,添加新学生时默认会添加它们。当我获取结果时,我应该得到所有的书名,包括数学和科学。

我想要做的是在三个部分中显示数据,标题为数学,科学和其他。数学和科学只包含一行,即数学或科学。所有其他书籍都应该在阅读部分。

如何继续实现这一目标?

1 个答案:

答案 0 :(得分:4)

创建NSFetchResultsController时,请在获取请求中使用books表的实体名称。

然后使用此...

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

typePropertyName将是从书籍到其所在部分名称的路径。

如果您直接在Book表中使用它可能只是@“typeName”,如果您与名为type的表有关系,那么它可能是@“type.name”然后该表有一个名为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]
}

然后,这将使用部分名称作为每个部分的标题。

相关问题