【问题标题】:Core data - info about to-many relationship properties核心数据 - 关于多关系属性的信息
【发布时间】:2013-12-31 16:57:43
【问题描述】:

我是 Core Data 的新手,我正在构建一个音乐库应用程序,它有两个选项卡:
songsartists 选项卡,显示艺术家列表每个艺术家的总歌曲数和总歌曲持续时间(同样是每个艺术家行)

我的核心数据对象:

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. 就像我说的,我还需要每个艺术家都有其所有歌曲的总时长,我怎样才能得到它? (同样不加载所有歌曲对象)

【问题讨论】:

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


【解决方案1】:

首先,您不应该担心 Core Data 在您访问关系时在后台执行的操作。尤其是与获取结果控制器连接时,Core Data 将找到性能和内存占用的最佳组合。也许这就是拥有对象图而不是关系数据库的全部意义所在。

最好还是跳过allObjects 并更简洁地调用

artists.songs.count

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

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

同样,Core Data 框架将确保您获得非常高效和高性能的代码。

【讨论】:

  • 您好,谢谢您的回答,为我列表中的每个艺术家调用@sum 不会太重,是不是意味着它将为每个艺术家查询数据库?也许有一种方法可以在我的原始提取请求中获取每个艺术家的总和?
  • 我不知道您的原始获取请求是什么,但请放心,所提供的代码将导致极其高效的数据库调用。使用 FRC,Core Data 将只获取它需要在屏幕上显示的内容,这是微不足道的数据量。关键是你不必担心它! :) 此代码将执行 250.000 首歌曲。
猜你喜欢
  • 2016-05-07
  • 2012-05-26
  • 1970-01-01
  • 2013-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多