我的核心数据模型如下所示:
Song
=====
name
duration
album
inPlaylists (to many relationship)
Playlist
========
title
songs (to many relationship)
每个Playlist
与Song
具有多对多关系,反之亦然。
我有一个播放列表视图控制器,它显示Playlist
个对象的列表
要填充播放列表tableview,我会使用常规方式创建NSFetchRequest
并将其与NSFetchedResultsController
一起使用:
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Playlist"];
request.predicate = nil;
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"title" ascending:YES]];
request.fetchBatchSize = 20;
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.context
sectionNameKeyPath:nil
cacheName:nil];
一旦用户点击播放列表行,我想推送另一个显示播放列表歌曲的视图控制器。
我的问题是如何获取播放列表歌曲?
我知道我有播放列表对象,所以我可以通过调用playlist.songs.allObjects
来获取它的歌曲数组,但我不确定它的效率如何,我也想使用NSFetchedResultsController
所以我可以享受它的全部委托更新tableview的方法。
那么这种基本场景的最佳实践是什么?
顺便说一下,你可以看到播放列表实体没有playlistId
属性,我让核心数据处理密钥,所以如果可能的话我不想添加这个属性。
答案 0 :(得分:2)
要在表格视图中显示所选播放列表的所有歌曲,您需要创建一个
获取结果控制器(就像您对播放列表表所做的那样),但是
对Song
实体的获取请求:
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Song"];
和谓词使用从“歌曲”到“播放列表”的反向关系:
request.predicate = [NSPredicate predicateWithFormat:@"ANY inPlaylists = %@",
selectedPlaylist];
“ANY”关键字是必要的,因为“inPlaylists”是一种多对多的关系。