1

我想使用 Core Data 执行以下 SQL 查询:

SELECT t1.date, t1.amount + SUM(t2.amount) AS importantvalue
FROM specifictable AS t1, specifictable AS t2
WHERE t1.amount < 0 AND t2.amount < 0 AND t1.date IS NOT NULL AND t2.date IS NULL
GROUP BY t1.date, t1.amount;

现在,看起来 CoreData 获取请求只能从单个实体获取。有没有办法在一个提取请求中完成整个查询?

4

2 回答 2

1

我知道的最好方法是为您希望一起获取的实体创建一个抽象父实体。

因此,如果您有 - “肉类”、“蔬菜”和“水果”实体,您可以为“食物”创建父抽象实体,然后获取“食物”实体中的所有甜实体。这样,您将获得所有甜美的“肉类”、“蔬菜”和“水果”。

看这里: Apple 文档中的实体继承

于 2012-12-29T13:17:22.957 回答
1

尼古拉,

Core Data 不是 SQL 系统。它有更原始的查询语言。虽然这看起来是赤字,但实际上并非如此。它迫使您将东西放入 RAM 并在那里而不是在数据库中进行复杂的计算。NSSet/NSMutableSet 操作非常快速有效。这也导致了更快的应用程序。(这在闪存很慢的 iOS 上尤为明显,因此,大获取是首选。)

在回答您的问题时,是的,提取请求在单个实体上运行。不,您不仅限于该实体的数据。一种是使用关键路径来遍历谓词语言中的关系。

Shannoga 的回答是解决您的问题的一种好方法。但我对您实际上试图用您的数据模型完成什么来判断使用实体继承是否是您的应用程序的正确路径知之甚少。可能不是。

来自服务器的 SQL 模式在 CD 应用程序中可能没有意义。查询语言和数据在 UI 中的使用方式都可能强制使用不同的结构。(例如,在 iOS 上使用 fetched results 控制器可能会迫使您以不同于在服务器上的方式对数据进行非规范化。)

实体继承,就像 OOP 中的继承一样,是一种僵硬的技术。很难改变。因此,我小心翼翼地使用它。当我使用它时,我在一些获取中获得了性能,并在其他计算中获得了一些简化。在其他时候,这是错误的答案,性能明智。

真正的答案是一个问题:你真正想要做什么?

安德鲁

于 2012-12-30T12:49:37.420 回答