iphone - 核心数据: 3 table join?

标签 iphone sql ipad core-data

我知道 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/

相关文章:

iphone - 我的应用程序在处理苹果商店时执行不同的操作

ipad - VPN 仅适用于 iPad 上的某些应用程序

iphone - 如何在 iOS 中创建时间表?

sql - 删除 SQL 中的重复行

iphone - 如何计算包含表情符号iphone的文本高度

ios - 在 Swift 中任意按下更改自定义 UIButton 的 BG 颜色

ios - 使用 Codable (Swift) 从 Json 文件中解析 UIColor

MySQL - 为每组日期选择最大日期

sql - 我怎样才能优化这个查询...?

iphone - iOS应用程序后台下载