获取多对象的核心数据最佳实践

时间:2014-01-05 09:59:47

标签: ios iphone objective-c core-data nsfetchedresultscontroller

我的核心数据模型如下所示:

Song
=====
name
duration
album

inPlaylists (to many relationship)

Playlist
========
title

songs (to many relationship)  

每个PlaylistSong具有多对多关系,反之亦然。

我有一个播放列表视图控制器,它显示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属性,我让核心数据处理密钥,所以如果可能的话我不想添加这个属性。

1 个答案:

答案 0 :(得分:2)

要在表格视图中显示所选播放列表的所有歌曲,您需要创建一个 获取结果控制器(就像您对播放列表表所做的那样),但是 对Song实体的获取请求:

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Song"];

和谓词使用从“歌曲”到“播放列表”的反向关系:

request.predicate = [NSPredicate predicateWithFormat:@"ANY inPlaylists = %@",
                                          selectedPlaylist];

“ANY”关键字是必要的,因为“inPlaylists”是一种多对多的关系。