【问题标题】:Many-to-many relationships with NSFetchedResultsController与 NSFetchedResultsController 的多对多关系
【发布时间】:2012-12-18 00:24:51
【问题描述】:

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

并希望使用NSFetchedResultsControllerUITableView 中显示它。我想列出给定Owner 的所有Objects,按Group 分组。例如,如果我们要查看某个 Owner 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 来获取一堆Objects,其谓词类似于[NSPredicate predicateWithFormat:@"ANY groups.owner = %@", someOwner],这会引发NSInvalidArgumentException 异常:“此处不允许多对多键”。我尝试了其他一些谓词,但都卡住了。

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

谢谢!

编辑:我实际上得到了使用上述代码的谓词,我的错误在于我的sectionNameKeyPath 参数。我试图传入groups.name,这是产生错误的原因。我可以理解为什么这种方式行不通,但我正在努力寻找一种不同的方式来实现预期的结果。也许是一个连接对象?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 谢谢。我创建了一个连接对象,如我的第二次编辑中所示,但我认为这实际上并没有比你的第一个解决方案给我任何优势。我希望这些行是动态的,您的第二个解决方案让我感兴趣。为每个部分创建一个获取结果控制器的效率有多低?如果我有 50 个部分,你知道内存要求是什么吗?
    【解决方案2】:

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

    看到这个答案:How to deal with many to many relationships with NSFetchedResultsController?

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多