2

我有一个看起来像这样的模型:

核心数据模型

并希望UITableView使用NSFetchedResultsController. 我想列出Object给定的所有 s 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每当对象被修改或从组中添加/删除时,都会调用委托方法。

鉴于这些要求,我设置了sNSFetchedResultsController来获取一堆Object带有谓词 like 的 s [NSPredicate predicateWithFormat:@"ANY groups.owner = %@", someOwner],这会引发NSInvalidArgumentException异常:“此处不允许使用多键”。我尝试了其他一些谓词,但被卡住了。

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

谢谢!

编辑:我实际上得到了使用上述代码的谓词,我的错误在于我的sectionNameKeyPath论点。我试图通过groups.name,这是产生错误的原因。我明白为什么这种方式行不通,但我正在努力寻找一种不同的方式来达到预期的效果。也许是一个连接对象?

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

带有连接对象的模型

我现在看到有两个缺点。首先是我必须自己使用代码强制执行唯一性。这很容易,但有点麻烦。第二个缺点,我还没有看到解决方法,是NSFetchedResultsController不会再调用它的委托来更新Objects。我现在可以忍受这个缺点,但很高兴听到更好的建议。

4

2 回答 2

1

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

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

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

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

于 2012-12-18T01:40:40.587 回答
1

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

请参阅此答案:如何处理与 NSFetchedResultsController 的多对多关系?

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

于 2015-03-03T21:34:28.607 回答