我知道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
有更好的方法吗?提前感谢您的考虑。
答案 0 :(得分:8)
你倒退了。
首先,您不需要核心数据中的链接ID,因为所有相关对象已经通过关系链接。这意味着根本不需要像where a.id = b.aid and b.id = c.bid
这样的结构。
其次,您通常为接收定义测试的实体设置获取实体。在这种情况下,即c.attr="X"
因此,您将获取实体设置为C
,并且您的谓词应如下所示:
NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue];
这将返回满足测试的所有C
个实例的数组。然后找到任何特定的B
或A
,只需要处理每个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'