基于对多关系另一端的属性,为项目构造核心数据获取的最佳方法

Best way to structure Core Data fetch for items, based on attribute(s) at other end of to-many relationship

我正在构建一个自测式应用程序。它基本上是全屏幻灯片的集合视图。每张幻灯片都有多个注释,用户可以点击这些注释来测试自己。幻灯片按类别分组,用户可以按类别过滤。

我想实现根据用户是否标记了注释来过滤注释的功能 known/not known/etc。我当前的数据模型(相关部分)如下所示:

---------------        ---------------------------------------------
| Slide       |        | Annotation                                |
---------------        ---------------------------------------------
| name        |        | lastKnown (enum for known/not known/etc.) |
| category    |        | ...                                       |
---------------        ---------------------------------------------
| annotations | <--->> | slide                                     |        
---------------        ---------------------------------------------

自上次 known/not known/etc。响应存在于注释对象中,在我看来我需要:

  1. 在幻灯片实体上创建一个提取(对于我的 NSFetchedResultsController)
  2. 对所选类别使用谓词(因此我只获得该类别的幻灯片)
  3. 筛选幻灯片是否有任何注释,其中 lastKnown 与所选 known/not known/etc 过滤器相匹配(这样,如果该类别的幻灯片没有任何与所选 known/notknown/etc.filter,被排除)

我在 1 和 2 上都设置好了,但在 3 上遇到了问题。我目前的理解是每张幻灯片的注释关系将 return 一个注释对象的 NSSet。看来我需要测试每一个,看看它们是否符合 known/not known/etc 中的标准。筛选。在我看来,我应该在谓词中这样做,这样我就可以重新加载集合视图来刷新数据。

谁能提供一些关于最有效方法 3 的最佳实践?

您应该查看 ANY 操作:

NSPredicate *slidePredicate = [NSPredicate predicateWithFormat:@"category == 'category'"];

NSPredicate *annotationPredicate = [NSPredicate predicateWithFormat:@"ANY annotations.lastKnown = 'known'"];

NSCompoundPredicate *predicate = [NSCompoundPredicate andPredicateWithSubpredicates:@[slidePredicate, annotationPredicate]];