Core Data 获取请求与 NSFetchedResultsController 的一对多关系

Posted

技术标签:

【中文标题】Core Data 获取请求与 NSFetchedResultsController 的一对多关系【英文标题】:Core Data fetch request one-to-many relationships with NSFetchedResultsController 【发布时间】:2019-12-23 07:47:02 【问题描述】:

如果我有几个实体,比如说流派、艺术家、歌曲,并且这三个一对多之间存在关系,我如何在流派中搜索艺术家,因为我有一个通用的 NSFetchedResultsController,即在我的表视图符合的CoreManager 类中。该代码可以很好地请求实体的内容,但我不确定我是否点击了其中一种流派来显示其中的艺术家并进入多个级别。 我的 FRC 代码是

fetchedResultsController = 
    let request = fetchRequest
    request.sortDescriptors = sortDescriptor
    request.predicate = fetchPredicate
    request.returnsObjectsAsFaults = false
    let context = managedContext
    let frc = NSFetchedResultsController(
        fetchRequest: fetchRequest,
        managedObjectContext: context,
        sectionNameKeyPath: sectionNameKeyPath , cacheName: cacheName)
    return frc
()

【问题讨论】:

请您提供模型实体和关系的更多详细信息。谢谢。 我用图像更新了我的模型图的问题,我现在只关心如何获取所有艺术家,例如在特定流派下,如何在 ArtistViewController 中的 FRC 中调用它。谢谢! :) 【参考方案1】:

如果您希望 FRC 通过 Genre 过滤 Artists,则需要添加从 ArtistGenre 的关系(与 Genre 实体上的 artists 关系相反)。附带说明一下,您几乎应该始终为每个关系定义一个逆向关系——在极少数情况下,没有逆向关系会更好。

我不确定您是否会将每个 Artist 视为只有一个 Genre,或者可能有很多 - 将关系设置为 to-oneto-many 视情况而定,并将其命名为 genregenres 相应地。然后需要的谓词在每种情况下都会有所不同:

对于一对一,你应该使用

NSPredicate(format:"genre == %@", chosenGenre)

对于很多人你会使用

NSPredicate(format:"ANY genres == %@", chosenGenre)

(假设您已经有一个参考,chosenGenre,指向您希望过滤的类型。如果您实际上只有类型标题,您可以使用:

NSPredicate(format:"genre.title == %@", chosenGenreTitle)

对于很多人你会使用

NSPredicate(format:"ANY genres.title == %@", chosenGenreTitle)

【讨论】:

我完全明白你解释的关系。我的模型只是一个草稿,此时我的主要关注点是了解如何获取与特定对象相关的项目,就像您在此处显示的 chosenGenrechosenGenre,该参考是 indexPath,是它是整个流派对象从genreViewController 传递到artistViewController,这是我不确定它是如何完成的部分。如果可以帮助我理解那部分:)? chosenGenre 是一个实际的 Genre 对象。假设genreViewController 是一个tableViewController,行显示各个流派对象的详细信息,当用户点击一行时,您将根据indexPath 查找正确的流派,并将该流派传递给ArtistViewController。 ArtistViewController 在其 FRC 的谓词中使用该 Genre 对象。

以上是关于Core Data 获取请求与 NSFetchedResultsController 的一对多关系的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Core Data 获取请求从自定义 UITableViewCell 返回空?

Core Data MagicalRecord:获取请求并保存在多线程中。锁定获取的对象?

如何使用 Core Data 关系?

有没有比获取请求更快的方法来检索 Core Data 中的特定托管对象?

如果Core Data count / fetch请求中的实体名称错误,如何避免崩溃?

Swift 3 Core Data - 获取结果控制器