我知道 Core Data 不是数据库,有很多区别。是这个吗?
在数据库中,我通常会有以下内容
A ->> B ->> C
“A”有很多“B”,“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',原因:'此处不允许多个对多键'
我的解释是否正确,即数据库所谓的多表连接存在限制?
我用谷歌搜索了一下,找不到明确的答案。
我当前对此查询的解决方案如下所示:
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
or A
只是处理每个人的关系的问题C
.
如果你的逆关系是一对一的,例如 A>B>C,那么你只需问每个C
的价值b.a
so:
AObject *anA = aCinstance.b.a;
重要的是要记住,您在这里处理的不是表格。您正在处理一个对象图。您将获取设置为特定实体,然后遍历过滤后的实体的关系。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)