与NSFetchedResultsController的多对多关系

时间:2012-12-18 00:24:52

标签: objective-c ios core-data nspredicate nsfetchedresultscontroller

我的模型看起来像这样:

Core data model

并希望使用UITableViewNSFetchedResultsController中显示。我想列出给定Object的所有Owner,按Group分组。例如,如果我们要查看某个所有者Owner A的组,则表视图可能如下所示:

Group A
  Object A
  Object B
  Object C
Group B
  Object A
  Object D
Group C
Group D
  Object C
  Object E

按照name属性(上图中未显示)对这些组进行排序,并且只要在组中修改或添加/删除对象,就会调用NSFetchedResultsController委托方法,这一点也很重要。

鉴于这些要求,我已设置NSFetchedResultsController以使用类似Object的谓词来获取一堆[NSPredicate predicateWithFormat:@"ANY groups.owner = %@", someOwner],这会引发NSInvalidArgumentException异常:“to - 这里不允许使用钥匙“。我尝试过其他一些谓词,但是被卡住了。

有什么建议吗?这不是我应该使用NSFetchedResultsController的东西吗?或者有更好的方法来建模我的数据吗?

谢谢!

编辑:我实际上让谓词使用上面的代码,我的错误在我的sectionNameKeyPath参数中。我试图传递groups.name,这就是产生错误的原因。我可以看出为什么这种方式不起作用,但我正在努力找到一种不同的方式来达到预期的效果。也许是一个连接对象?

编辑2:这对于像这样的连接对象有效:

model with join object

我现在看到两个缺点。首先,我必须使用代码来强制执行唯一性。这很容易,但有点令人讨厌。第二个缺点是,我还没有看到解决方法,NSFetchedResultsController将不再调用其代理人来更新Objects。我现在可以忍受这种不利因素,但我很高兴听到更好的建议。

2 个答案:

答案 0 :(得分:1)

我认为您将要看到的问题是,如果您有一个获取的结果控制器搜索对象,那么它将只找到每个Object一次。因此,每个对象在您的表中只出现一次。而您想要做的是反转事物并查找所有组,然后显示所有相关的包含对象。就获取结果控制器而言,不是查找行,而是能够划分成您想要查找部分的部分,从而找出要作为行提供的内容。

我认为最简单的方法是在Group上创建一个获取的结果控制器,并添加一个自己的中间对象,将这些对象重新映射到各个部分并提供group.objects(应用了适当确定的排序)作为行每节。

如果您希望行是动态的,那么我想最简单的方法是根据Group控制器的反馈为每个部分创建一个获取的结果控制器。

如果这一切都变得有点痛苦并且您想要编写自己的集合逻辑,那么您可能希望捕获NSManagedObjectContextDidSaveNotification并在发生时重新运行逻辑。出于内存效率的原因,您可能希望仅保留objectID s并仅在表视图通过上下文中的existingObjectWithID:error:方法请求它们时才获取相应的对象。 Core Data有一个内置的缓存机制,可以适当地响应内存警告,所以这些都是为你编写的。

答案 1 :(得分:1)

您不需要连接对象来获取多对多关系中的数据

请参阅此答案:How to deal with many to many relationships with NSFetchedResultsController?

示例项目:https://github.com/dmathewwws/Many-to-Many-CoreData