核心数据:3表联接?
我知道核心数据不是数据库,并且有很多差异。是这个吗?
在数据库中,我通常有以下内容
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'
在Core Data中,我想做同样的事情,但是要使用类似这样的谓词:
NSPredicate *predicate =
[NSPredicate predicateWithFormat:@"ANY bs.cs.attr = %@", "X"];
[frequest setEntity:entityA];
[frequest setPredicate:predicate];
这样做会导致错误:“ NSInvalidArgumentException”,原因:“此处不允许使用多对多键”
我的解释正确吗,意思是什么数据库都限制了多表联接?
我四处搜寻,找不到明确的答案。
我当前对该查询的解决方案如下:
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
有没有更好的办法?预先感谢您的考虑。
-
您对此倒退了。
首先,您不需要Core Data中的链接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 <->> B <->> C,则您只要求每个都
C
提供b.a
so的值:AObject *anA = aCinstance.b.a;
重要的是要记住您不在这里处理表。您正在处理对象图。您将提取设置为特定实体,然后遍历过滤后的实体之间的关系。