使用带有分组的FetchedResultsController

4
我正在编写一个小应用程序,其中我使用了coredata,我的数据中包含科目,包括数学、科学和其他书籍。
其他书籍可以添加或删除,但是数学和科学不能被删除,当添加新学生时,它们将默认添加。当我获取我的结果时,我应该得到所有的书名,包括数学和科学。
我的目标是将数据显示在三个带有标题的部分中,分别为数学、科学和其他。 数学和科学将只包含一行,即数学或科学。 所有其他书籍应该在阅读部分中。
如何进行操作以实现这一目标?

这就是sectionname keypath发挥作用的地方。如果你有一些名为subjects的属性,其中包含科学、数学和其他科目,那么在fetchedresultscontroller的performFetch:方法中使用sectionNameKeyPath:作为subject,其他部分将与Apple模板提供的几乎相同。 - Sandeep
1个回答

4

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

然后使用如下内容...

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

typePropertyName将是从图书到所在章节的名称的路径。

如果你直接在Book表中拥有它,它可以只是@"typeName",或者如果你有一个与名为"type"的表相关联,然后该表具有一个名为name的字段,则可以是@"type.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]
}

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

谢谢您的回复,但是在我的实体中没有用于分类部分的属性。类别就像在数组中一样,如果主题名称是数学,它应该放在数学部分,如果主题名称是科学,那么它应该放在科学部分,否则它应该落在其他部分。 - Ayan
然后只需使用字段名称即可 :D - Fogmeister

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接