gpt4 book ai didi

iphone - 核心数据: 3 table join?

转载 作者:行者123 更新时间:2023-12-03 18:43:27 25 4
gpt4 key购买 nike

我知道 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,因为所有相关对象都已通过关系链接。这意味着根本不需要像 其中 a.id = b.aid 和 b.id = c.bid 这样的结构。

其次,您通常为接收定义测试的实体设置获取实体。在本例中,即 c.attr="X"因此,您将获取实体设置为 C 并且您的谓词应类似于:

NSPredicate *p=[NSPredicate predicateWithFormat:@"attr=%@",xValue];

这将返回一个数组,其中包含所有满足测试的 C 实例。然后,查找任何特定的 BA 只需遍历每个 C 的关系即可。

如果您的逆关系是一对一的,例如 A<->>B<->>C,那么您只需向每个 C 询问 b.a 的值所以:

AObject *anA = aCinstance.b.a;

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

关于iphone - 核心数据: 3 table join?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3800835/

25 4 0