2011-06-13 147 views
2

我遇到了UITableViews和多对多关系的问题。UITableView和核心数据对多关系

我有两个类,A和B,它们都扩展NSManagedObject并存在于Core Data中。每个人都有一个一对多的关系,其他:

一个< < - >> B

我想用A类对象作为一个UITableView的部分,它的集合B的对象为“数据行”在TableView中。这是否可能,以及实现这一目标的最佳方法是什么?最好我想使用NSFetchedResultsController来管理UITableView提供的数据,但到目前为止,我还没有能够提出一个可用的谓词和节名称键路径。

回答

1

我会使用NSFetchedResultsController来监视A对象。使用您获取的结果来填充节标题。然后当你正在寻找填充你的“数据行”时,你可以找到你当前的A对象(通过使用[[fetchedResultsController fetchedResults] objectAtIndex:indexPath.section]或类似的东西),并用A.BOjbects从它中提取B对象,它返回与A相关的所有B对象的NSSet目的。完成之后,您可以按照您的要求对列表进行筛选或排序,然后再将它们放入行中

+0

我使用这种方法解决了它 - 使用获取的结果控制器来观察节,然后用每个节的相关对象填充行。似乎到目前为止工作得不错。 – Malakim 2011-06-16 06:07:10

2

您不能使用抓取的结果控制器来执行此操作。

如果A对象是部分名称和每个B对象有许多A关系那么每个B可以在表中显示多次在不同的部分。核心数据是围绕独特对象的思想而建立的,所有tableview的样板代码都假定每行代表一个唯一的对象。在这种情况下,即使统计行数也很困难,并且sectionNameKeyPath将无法设置,因为它可能在任何时候都有多个值。

您需要手工配置所有这些。您必须获取A对象,然后设置节标题,然后您将必须获得每个A.bObjs,并对每个节中的行进行单独计数和排序。删除一个存在的B对象可能会很困难,因为它可能会触发同时删除多行。

我会敦促你重新考虑你的设计。节和节标题不应该表示托管对象,而应该是基于行对象的一个​​属性对行所表示的托管对象进行分组。你真正想要的是一个主 - 细节视图层次结构。顶部tableview将显示所有A对象。选中某行后,它将加载第二个表格视图,该视图显示与所选A对象相关的所有B对象。

+0

是的,我知道 - 不幸的是UI设计大部分都不在我的手中。 – Malakim 2011-06-16 06:08:07