针对特定集合的多对多关系核心数据查询

Posted

技术标签:

【中文标题】针对特定集合的多对多关系核心数据查询【英文标题】:Many to many relationship core data query for specific collection 【发布时间】:2017-10-29 13:31:40 【问题描述】:

public enum Ability: String 
  case newcomer = "Newcomer"
  case beginner = "Beginner"
  case intermediate = "Intermediate"
  case advanced = "Advanced"


public enum Group: String 
  case solo = "Solo"
  case duo = "Duo"
  case team = "Team"

我想找到所有符合以下条件的表演。

ability == "Beginner"
group == "Duo"
performers == "Jane Davies" && "Alice Evans"

The documentation 表示不支持核心数据中的聚合操作,这令人惊讶。像这样的问题已经在这里asked before 并建议使用“任何”。

据我了解,“Any”会返回包含“Jane”或“Alice”或“Jane & Alice”的表演,对吗?我只想要包含“简和爱丽丝”的表演。

如何为这个查询编写谓词?

谢谢

【问题讨论】:

您要针对字符串数组还是针对(两个)Performer 对象的数组进行测试? 嗨@MartinR 我对两者都感兴趣。 你已经接受了一个答案,所以显然问题已经解决了。 – 我只是想知道,因为该谓词会将所有包含“Jane”“Alice”的对象作为表演者,并且根本不尊重姓氏。 你的权利@MartinR 您想提交解决方案@MartinR 吗? 【参考方案1】:

对于(不同的)Performer 对象列表,以下谓词应该起作用 找到与那些完全相关的所有 Performance 对象 表演者:

let perf1 = ... // Performer object for "Jane Davies"
let perf2 = ... // Performer object for "Alice Evans"
let list = [perf1, perf2]

let predicate = NSPredicate(format: "performers.@count = %ld AND ALL performers in %@", list.count, list)

但显然不是。解决方法是使用 SUBQUERY:

let predicate = NSPredicate(format: "performers.@count = %ld AND SUBQUERY(performers, $p, $p in %@).@count = %ld",
      list.count, list, list.count)

【讨论】:

这适用于“performers.@count = %ld AND %@ 中的任何表演者”,但这不适用于“performers.@count = %ld AND %@ 中的所有表演者” @robdashnash:这很奇怪,因为第一个会匹配表演者 = ["Jane Davies", "SomeOne Else"] 我同意。 [错误]错误:异常处理请求:,不支持的谓词组==“Duo”AND能力==“Newcomer”AND performers.@count == 2 AND ALL performers IN <0x60400028a410>

以上是关于针对特定集合的多对多关系核心数据查询的主要内容,如果未能解决你的问题,请参考以下文章

核心数据:与状态的多对多关系

NSPredicate 在核心数据中的多对多关系

核心数据断言 sectionNameKeyPath 重复出现的多对多关系

根据特定的多对多关系过滤 Django 查询集

如何在 IOS Swift 中获取核心数据中的多对多关系?

针对标签上的多对多连接优化 MySQL 查询