
在数据库中,我通常会有以下内容
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桌加入?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)