核心数据 - 有关多对多关系属性的信息

时间:2013-12-31 16:57:43

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

我是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;
}

我有两个问题:

  1. 这是获取每位艺术家总歌曲的正确方法吗?当我打电话给artist.songs.allObjects.count核心数据取得所有歌曲?因为我真的不需要歌曲对象..
  2. 就像我说我也需要每个艺术家都有其所有歌曲的总持续时间,我怎么能得到它? (再次没有加载所有歌曲对象)

1 个答案:

答案 0 :(得分:2)

首先,在访问关系时,您不必担心Core Data在后台提取的内容。特别是与获取的结果控制器相关的Core Data将找到性能和内存占用的最佳组合。也许这是关于拥有对象图而不是关系数据库的重点。

仍然可能最好跳过allObjects并简单地简单地调用

artists.songs.count

其次,对于持续时间计算,您可以利用所有托管对象都符合键值编码的事实。你可以使用这样的集体运算符:

NSNumber *totalDuration = [artist.songs valueForKeyPath:@"@sum.duration"];

同样,核心数据框架将确保您获得非常高效且高性能的代码。