核心数据获取请求与 NSFetchedResultsController 的一对多关系

Core Data fetch request one-to-many relationships with NSFetchedResultsController

如果我有几个实体,比如流派、艺术家、歌曲,这三个实体之间存在一对多关系,假设我有一个通用 NSFetchedResultsController,在我的 CoreManager class 中,我的表格视图符合。该代码可以很好地请求实体的内容,但我不确定我是否点击了其中一个流派来显示其中的艺术家并进入多个级别。 我的 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
}()

如果您希望 FRC 按 Genre 过滤 Artists,您需要添加从 ArtistGenre 的关系([= Genre 实体上的 18=] 关系)。作为旁注,您应该几乎总是为每个关系定义一个逆函数——在极少数情况下,如果没有逆函数,您会过得更好。

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

对于to-one,你应该使用

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

而对于 to-many,您将使用

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

(假设您已经有参考 chosenGenre 到您希望过滤的流派。如果您实际上只有流派标题,您可以使用:

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

而对于 to-many,您将使用

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