NSFetchedResultsController 和 TableViews

Posted

技术标签:

【中文标题】NSFetchedResultsController 和 TableViews【英文标题】:NSFetchedResultsController and TableViews 【发布时间】:2011-05-23 09:41:31 【问题描述】:

我正在尝试将 Core Data 与 NSFetchedResultsController 一起使用。

数据模型分为“树级别”。

父母->(许多)孩子->(许多)孙子

在表格视图中,我想将父级的所有子项显示为部分,将 GrandChildrens 显示为单元格。我很难弄清楚如何解决这个问题。

任何建议将不胜感激。

编辑 数据模型:

Parent:
name NSString*
Id NSNumber*
child NSSet* (set of childs)

Child:
name NSString*
childId NSNumber*
parent Parent*
childrensChilds NSSet* (set of childrensChilds)

ChildrensChild:
name NSString*
ChildrensChildId NSNumber*
parentChild *Child

FetchRequest:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Child" inManagedObjectContext:moc];
[fetchRequest setEntity:entity];

NSSortDescriptor *sort = [[NSSortDescriptor alloc] initWithKey:@"ChildId" ascending:NO];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent.parentId = %@", self.parentId];
[fetchRequest setPredicate:predicate];

[fetchRequest setFetchBatchSize:20];

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:moc sectionNameKeyPath:nil cacheName:@"Childrens"];
self.fetchedResultsController = theFetchedResultsController;
fetchedResultsController.delegate = self;

[fetchRequest release];
[theFetchedResultsController release];

然后我想创建带有子名称的节标题和以childschild命名的单元格。

【问题讨论】:

给我们一些代码和数据模型。 【参考方案1】:

当使用带有表格视图的获取结果控制器 (FRC) 时,您将获取实体设置为将填充行的实体。毕竟,节是可选的,但总是需要行。

您需要做的第一件事是在数据模型中设置互惠关系,如下所示:

Parent<-->>Child<-->>GrandChild

...这允许您从任何实体开始横向对象,例如如果你有一个 Grandchild 对象,你可以使用 keypath 'parentChild.parent'(或任何你称之为关系的东西)通过遍历Child 对象来到达相关的Parent 对象。

要根据需要配置表格视图,您可以将获取实体设置为GrandChild,将谓词设置为parentChild.parent.id=%@,然后将FRC sectionNameKeyPath 设置为parentChild.name

但是,您可能想要重新考虑您的整个设计。树结构的更简单的数据模型是:

Person
  name:string
  id:number
  parent<<-->Person.children
  children<-->>Person.parent

孙子是孩子,两个向下遍历,祖父母是父母,两个向上遍历。一旦你有任何特定的 Person 对象,那么在 tableview 中显示将是微不足道的。部分名称将是“孩子”关系的排序数组,行将是每个孩子自己的孩子的排序数组。

您根本需要摆弄 fetches。

【讨论】:

以上是关于NSFetchedResultsController 和 TableViews的主要内容,如果未能解决你的问题,请参考以下文章

在 Core Data 应用程序中调用 performFetch 后,是不是需要手动更新表视图?