带有部分的 FetchedResultsController

Posted

技术标签:

【中文标题】带有部分的 FetchedResultsController【英文标题】:FetchedResultsController with sections 【发布时间】:2012-11-29 08:40:49 【问题描述】:

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

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

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

如何继续实现这一目标?

【问题讨论】:

这就是 sectionname 键路径发挥作用的地方。如果您有一些名为 subject 的属性,其中包含科学、数学和其他属性,那么在 fetchedresultscontroller performFetch: 方法中使用 sectionNameKeyPath: as subject 和所有其他属性将与苹果模板提供的几乎相同。 【参考方案1】:

当您创建 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]

这将使用节名作为每个节的标题。

【讨论】:

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

以上是关于带有部分的 FetchedResultsController的主要内容,如果未能解决你的问题,请参考以下文章

CoreData NSFetchRequest 返回结果,但对象的节数返回 0

UIButton 状态在滚动带有多个部分的 tableview 时发生变化 - Swift

带有纯文本部分、html 部分和附件的电子邮件

带有 alpha 通道部分的透明 PNG 显示带有丑陋的边框

使用带有片段的部分,NullPointerException

如何突出显示带有孩子的 div(带有部分不透明层?)就像雅虎邮件一样,参见图片