获取多对象的核心数据最佳实践
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)
每个Playlist
与Song
具有多对多关系,反之亦然。
我有一个显示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]
。以上是关于获取多对象的核心数据最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
Navigation iPhone App 的核心数据最佳实践问题