iphone – 核心数据:3桌加入?

iphone – 核心数据:3桌加入?,第1张

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

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

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 fetchfor (B *b in bs) {  //add b.a into an array}//return array

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

解决方法 你向后走了这个.

首先,您不需要Core Data中的链接ID,因为所有相关对象已经通过关系链接.这意味着根本不需要a.ID = b.aID和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;

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

总结

以上是内存溢出为你收集整理的iphone – 核心数据:3桌加入?全部内容,希望文章能够帮你解决iphone – 核心数据:3桌加入?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1083294.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-27
下一篇2022-05-27

发表评论

登录后才能评论

评论列表(0条)

    保存