UITableView和Core Data to-many关系

时间:2011-06-13 13:39:17

标签: iphone objective-c core-data

我遇到了UITableViews和多对多关系的问题。

我有两个类,A和B,它们都扩展了NSManagedObject并且存在于Core Data中。每个人都与另一个有很多关系:

A<< - >>乙

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

2 个答案:

答案 0 :(得分:2)

您无法使用提取的结果控制器执行此操作。

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

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

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

答案 1 :(得分:1)

我会使用NSFetchedResultsController来监视A对象。使用提取的结果填充节标题。然后,当您要填充“数据行”时,可以找到当前的A对象(使用[[fetchedResultsController fetchedResults] objectAtIndex:indexPath.section]或类似的东西)并使用A.BOjbects从中提取B对象,这将返回NSSet与A对象关联的所有B对象。完成后,您可以在将列表放入行

之前对列表进行过滤或排序