SQL

核心数据:3表联接?

发布于 2021-04-20 23:12:34

我知道核心数据不是数据库,并且有很多差异。是这个吗?

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

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

有没有更好的办法?预先感谢您的考虑。

关注者
0
被浏览
66
1 个回答
  • 面试哥
    面试哥 2021-04-20
    为面试而生,有面试问题,就找面试哥。

    您对此倒退了。

    首先,您不需要Core Data中的链接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 <->> B <->> C,则您只要求每个都C提供b.aso的值:

    AObject *anA = aCinstance.b.a;
    

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



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看