【问题标题】:Fetching all Core Data subentities获取所有核心数据子实体
【发布时间】:2012-10-25 22:32:47
【问题描述】:

假设我在 Core Data 中有一个 Song 实体和 Genre 实体。流派有很多歌曲。

我想执行一个获取请求来获取所有歌曲的流派。这意味着流派会出现多次。或者,用 SQL 术语来说,

select G.*
  from Songs S
       join Genres G on G.id = S.genre_id

我意识到 SQL 等效项有点牵强,因为我不需要外键/主键。目标是一样的。看起来很简单,但我在研究中找不到完全适合我的问题的答案。

我的最终目标是汇总类型并计算它们,like in this post。同样,用 SQL 术语来说:

select G.name, count(*)
  from Songs S
       join Genres G on G.id = S.genre_id
 group by G.name

我希望通过对这个问题的理解,我可以从链接中添加代码以获得我想要的东西。随意告诉我,如果 CD 不能那样工作,它就不能工作。

【问题讨论】:

    标签: objective-c sql cocoa core-data


    【解决方案1】:

    假设在您的核心数据模型中,每个流派都与一首歌曲存在一对多关系,以下将为您提供每种流派的歌曲计数(实际上是聚合您的流派并计算它们),其中流派是附加到至少 1 首歌曲:

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY songs != NULL"];
    NSEntityDescription *genres = [NSEntityDescription entityForName:@"Genre" 
                                              inManagedObjectContext:moc];
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    [request setEntity:genres];
    [request setPredicate:predicate];
    NSError *error;
    NSArray *genresArray = [moc executeFetchRequest:request error:&error];
    NSLog(@"Total number of genres that have songs: %d", genresArray.count);
    for (NSManagedObject *genre in genresArray) {
      NSLog(@"Genre: %@ (%@)", [genre valueForKey:@"genreName"], [genre valueForKeyPath:@"songs.@count"]);
    }
    

    【讨论】:

      【解决方案2】:

      为什么不为没有 NSPredicate 的“流派”实体创建一个 NSFetchRequest?您将获得所有流派实例。还是您只想要有歌曲的流派?如果是这样,你可以找到一个例子here

      【讨论】:

      • 不。你的建议将给我每一个流派中的一个。通过查询歌曲但选择流派,每个流派每次使用显示一次。
      猜你喜欢
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多