Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题

Posted

技术标签:

【中文标题】Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题【英文标题】:Core Data 1-to-many relationship: List all related objects as section header in UITableView 【发布时间】:2010-02-25 19:58:23 【问题描述】:

我在 iPhone 上使用 Core Data 时遇到以下问题: 我在 Core Data 中有一对多的关系。假设实体被称为配方和类别。一个类别可以有许多食谱。 我完成了在 UITableView 中列出的所有食谱,其中部分标题以类别命名。 我想要实现的是将所有类别列为部分标题,即使是那些没有配方的类别:

category1   <--- this one should be displayed too
category2
     recipe_x
     recipe_y
category3
     recipe_z

 NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

 NSEntityDescription *entity = [NSEntityDescription entityForName:@"Recipe" inManagedObjectContext:managedObjectContext];
 [fetchRequest setEntity:entity];
 [fetchRequest setFetchBatchSize:10];

 NSSortDescriptor *sortDescriptor1 = [[NSSortDescriptor alloc] initWithKey:@"category.categoryName" ascending:YES];
 NSSortDescriptor *sortDescriptor2 = [[NSSortDescriptor alloc] initWithKey:@"recipeName" ascending:YES];
 NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor1,sortDescriptor2, nil];

 [fetchRequest setSortDescriptors:sortDescriptors];
 NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:@"category.categoryName" cacheName:@"Recipes"];

使用核心数据实现这一目标的最优雅方法是什么?

【问题讨论】:

【参考方案1】:

如果其中没有行,则实际上并不意味着要显示部分。这就是UITableView 的设计方式。如果您真的想要强制它,您需要在-numberOfRowsForSection: 的数据源调用中添加逻辑,使其看起来总是有一行,然后您可以使用-heightForRowAtIndexPath: 来尝试并隐藏该行。

话虽如此,这是一个可怕的想法。让这些部分像设计的那样隐藏起来。

【讨论】:

UI 约定的存在是为了使应用程序之间的界面行为保持一致。覆盖它会使您的应用程序的行为与其他应用程序不同,并可能导致对所呈现数据的混淆。我也会避免修改部分行为。【参考方案2】:

你不能用 sectionNameKeyPath 代码干净地做到这一点。我会修改获取请求查询类别,并告诉它包含子实体:

[fetchRequest setIncludesSubentities:YES];

这样查询会很高效,不会到处出错。从那里充实你的代表应该很简单。

【讨论】:

以上是关于Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题的主要内容,如果未能解决你的问题,请参考以下文章

Core Data 获取一对多关系的数据

在 Swift Core Data 中从一对多关系中获取对象

如何管理 Core Data 中的一对多关系?

如何处理 CORE DATA 中的一对多关系

Core Data 一对多关系:在 UITableView 中将所有相关对象列为节标题

在 Core Data 中有效地获取一对多关系中的最新记录