核心数据获取请求与 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
,您需要添加从 Artist
到 Genre
的关系([= Genre
实体上的 18=] 关系)。作为旁注,您应该几乎总是为每个关系定义一个逆函数——在极少数情况下,如果没有逆函数,您会过得更好。
我不确定您是否会将每个 Artist
视为只有一个 Genre
,或者可能有很多 - 将关系设置为 to-one
或 to-many
视情况而定,并相应地将其命名为 genre
或 genres
。然后需要的谓词在每种情况下都不同:
对于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)
如果我有几个实体,比如流派、艺术家、歌曲,这三个实体之间存在一对多关系,假设我有一个通用 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
,您需要添加从 Artist
到 Genre
的关系([= Genre
实体上的 18=] 关系)。作为旁注,您应该几乎总是为每个关系定义一个逆函数——在极少数情况下,如果没有逆函数,您会过得更好。
我不确定您是否会将每个 Artist
视为只有一个 Genre
,或者可能有很多 - 将关系设置为 to-one
或 to-many
视情况而定,并相应地将其命名为 genre
或 genres
。然后需要的谓词在每种情况下都不同:
对于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)