我的模型看起来像这样:
并希望使用UITableView
在NSFetchedResultsController
中显示。我想列出给定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:这对于像这样的连接对象有效:
我现在看到两个缺点。首先,我必须使用代码来强制执行唯一性。这很容易,但有点令人讨厌。第二个缺点是,我还没有看到解决方法,NSFetchedResultsController
将不再调用其代理人来更新Objects
。我现在可以忍受这种不利因素,但我很高兴听到更好的建议。
答案 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?