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

Posted

技术标签:

【中文标题】获取多对象的核心数据最佳实践【英文标题】:Core Data best practice to fetch to-many objects 【发布时间】:2014-01-05 09:59:47 【问题描述】:

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

Song
=====
name
duration
album

inPlaylists (to many relationship)

Playlist
========
title

songs (to many relationship)  

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

我有一个显示Playlist 对象列表的播放列表视图控制器。 为了填充播放列表表视图,我使用创建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,所以我可以享受它的所有更新委托方法表视图。

那么对于这种基本场景,最佳实践是什么?

顺便说一句,你可以看到播放列表实体没有playlistId 属性,我让核心数据处理键,所以如果可能的话我不想添加这个属性。

【问题讨论】:

【参考方案1】:

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

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

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

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

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

【讨论】:

非常感谢!还有一个问题,如果歌曲与播放列表的关系是“To-One”(即歌曲只能有一个播放列表),那么现在的谓词应该是什么? @user3149567:只需省略 ANY:... "inPlaylist = @", selectedPlaylist]

以上是关于获取多对象的核心数据最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

核心数据模型对象保存的最佳实践

使用 restkit 和核心数据的最佳实践

核心数据请求和保存的最佳实践

Navigation iPhone App 的核心数据最佳实践问题

Swift NSFetchedResultsController 嵌套对象的最佳实践

PHP核心技术与最佳实践