核心数据:3表加入?

Mik*_*ike 6 sql iphone core-data ipad

我知道Core Data不是一个数据库,并且存在许多差异.这是一个吗?

在数据库中,我通常会有以下内容

A - >> B - >> C

"A"有很多"B",有很多"C"

查询"给我所有有c.attr ='X'的A很容易写成:

select * from a, b, c where a.id = b.aid and b.id = c.bid and c.attr = 'X'
Run Code Online (Sandbox Code Playgroud)

在Core Data中,我想做同样的事情,但使用谓词如:

NSPredicate *predicate = 
  [NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"];
[frequest setEntity:entityA];
[frequest setPredicate:predicate];
Run Code Online (Sandbox Code Playgroud)

这样做会导致错误:'NSInvalidArgumentException',原因:'这里不允许多对多键'

我是否正确解释为什么数据库调用多表连接存在限制?

我用Google搜索,无法找到明确的答案.

我目前对此查询的解决方案如下:

NSPredicate *predicate = 
  [NSPredicate predicateWithFormat:@"ANY cs.attr = %@", "X"];
...
NSArray *bs = //execute fetch
for (B *b in bs) {
  //add b.a into an array
}
//return array
Run Code Online (Sandbox Code Playgroud)

有没有更好的办法?提前感谢您的考虑.

Tec*_*Zen 8

你向后走了这个.

首先,您不需要Core Data中的链接ID,因为所有相关对象已经通过关系链接.这意味着where a.id = b.aid and b.id = c.bid根本不需要构造.

其次,您通常为接收定义测试的实体设置获取实体.在这种情况下,也就是说c.attr="X",您将获取实体设置为,C并且您的谓词应该类似于:

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue];
Run Code Online (Sandbox Code Playgroud)

这将返回C满足测试的所有实例的数组.然后找到任何特定BA只是走路的关系为每个C.

如果您的反比关系是一个例如A < - >> B < - >> C,那么您只需询问每个C的值b.a:

AObject *anA = aCinstance.b.a;
Run Code Online (Sandbox Code Playgroud)

重要的是要记住你不是在这里处理表格.您正在处理对象图.您将获取设置为特定实体,然后遍历已过滤实体的关系.