我是Core Data的新手,我正在建立一种有两个标签的音乐库应用程序:
歌曲和艺术家标签,显示每位艺术家的总歌曲数量和整体歌曲持续时间的艺术家列表(每个艺术家行的数据)
我的核心数据对象:
Song
=====
name
duration
album
artist (to one relationship)
Artist
======
name
songs (to many relationship)
所以,现在我可以设法显示艺术家名单,每个艺术家的歌曲总数:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
// i know i should reuse the cells..
UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil];
Artist *artist = [self.fetchedResultsController objectAtIndexPath:indexPath];
cell.textLabel.text = [NSString stringWithFormat:@"%@ %lu", artist.name, (unsigned long)artist.songs.allObjects.count];
return cell;
}
我有两个问题:
artist.songs.allObjects.count
核心数据取得所有歌曲?因为我真的不需要歌曲对象.. 答案 0 :(得分:2)
首先,在访问关系时,您不必担心Core Data在后台提取的内容。特别是与获取的结果控制器相关的Core Data将找到性能和内存占用的最佳组合。也许这是关于拥有对象图而不是关系数据库的重点。
仍然可能最好跳过allObjects
并简单地简单地调用
artists.songs.count
其次,对于持续时间计算,您可以利用所有托管对象都符合键值编码的事实。你可以使用这样的集体运算符:
NSNumber *totalDuration = [artist.songs valueForKeyPath:@"@sum.duration"];
同样,核心数据框架将确保您获得非常高效且高性能的代码。