核心数据:3表加入?

时间:2010-09-27 03:01:24

标签: iphone sql ipad core-data

我知道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'

在核心数据中,我想做同样的事情,但使用谓词如下:

NSPredicate *predicate = 
  [NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"];
[frequest setEntity:entityA];
[frequest setPredicate:predicate];

执行此操作会导致错误: '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

有更好的方法吗?提前感谢您的考虑。

2 个答案:

答案 0 :(得分:8)

你倒退了。

首先,您不需要核心数据中的链接ID,因为所有相关对象已经通过关系链接。这意味着根本不需要像where a.id = b.aid and b.id = c.bid这样的结构。

其次,您通常为接收定义测试的实体设置获取实体。在这种情况下,即c.attr="X"因此,您将获取实体设置为C,并且您的谓词应如下所示:

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue];

这将返回满足测试的所有C个实例的数组。然后找到任何特定的BA,只需要处理每个C的关系。

如果您的反比关系为-A,例如A< - >>>>> C,您只需询问每个C b.a的值,以便:

AObject *anA = aCinstance.b.a;

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

答案 1 :(得分:1)

核心数据是否可以为b和a的属性添加测试?或者我是否必须连续迭代每个结果集以获得我的最终结果?

select 
  p.id, p.total 
from 
  purcord p, line l, delivery d 
where 
  l.purcord_id = p.id
  and d.purcord_id = l.purcord_id
  and d.purcord_line_no = l.line_no
  and d.status = 'notdelivered'
  and l.status = 'open'
  and p.status = 'open'