【问题标题】:Using NSFetchedResultsController to fetch an object's property使用 NSFetchedResultsController 获取对象的属性
【发布时间】:2017-02-24 00:32:00
【问题描述】:

我需要发出一个 CoreData 获取请求,该请求获取“List”类型的 ManagedObject,其属性包括:name(String)、hitCount(Int)、lastUpdated(Date) 和 contents(OrderedSet)。现在我需要在列表对象的内容属性中使用“媒体”ManagedObjects 填充我的 TableView。当我已经有我想要的内容的列表实例时,我已经尝试过......

let fetchRequest = NSFetchRequest<Media>(entityName: "Media")
fetchRequest.predicate = NSPredicate(format: "SELF in %@", list.contents)

...这给了我 CoreData 中已有的内容,但没有任何 NSFetchedResultsControllerDelegate 更新通过网络调用获得并在我最初抓取后添加到数据库的其他对象。我也试过...

let fetchRequest = NSFetchRequest<Media>(entityName: "List")
fetchRequest.predicate = NSPredicate(format: "name == %@", list.name)

...它返回列表项,我将获得 NSFetchedResultsControllerDelegate 更新,但仅在列表对象本身上移动类型 - 当它是内容属性时,不是应用于 TableView(删除/插入等)所需的实际更改变化。有没有办法实现我想要做的事情?非常感谢任何帮助。

【问题讨论】:

  • 媒体与列表之间是否存在反向关系?如果是这样,是一对一还是一对多:一个媒体对象可以与多个列表相关吗? (您需要的谓词在每种情况下都不同)。
  • 是的,存在反比关系。 List 对象的 content 属性映射到 Media 对象是一对多类型。到目前为止,从 Media 对象到 List 对象的反向关系是一对一类型,但现在考虑一下 Media 对象可以存在于多个列表中,所以可能双方都应该是一对多类型。

标签: ios core-data nsfetchedresultscontroller nsfetchrequest


【解决方案1】:

如果逆关系是一对一,称为listRelationship,那么你可以使用:

let fetchRequest = NSFetchRequest<Media>(entityName: "Media")
fetchRequest.predicate = NSPredicate(format: "listRelationship == %@", list)

作为 FetchedResultsController 底层的 fetch。如果关系是对多的,请将谓词更改为“ANY listRelationship == %@”。无论哪种情况,都很难确保 FRC 使用的排序顺序与 List 对象中的 NSOrderedSet 匹配。

如果这对您很重要,您将需要使用索引属性显式建模排序顺序。如果关系是一对一,您可以将index 属性添加到Media 实体,但如果是一对多,生活会变得更加困难:Media 对象可能是一个列表中的第一项,但另一个列表中的最后一项 - 因此索引与特定列表和特定媒体项相关。在这种情况下,添加另一个实体“ListEntry”,该实体具有index 属性和与ListMedia 的一对一关系(每个都有一对多逆)。

【讨论】:

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