2012-12-29 80 views
1

表别名我已在SQL查询下面,我想用核心数据做:现在SQL SELECT与核心数据

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提取请求只能从单个实体获取。有没有办法在单个抓取请求中完成整个查询?

回答

1

我知道的最好方法是创建一个抽象的父实体,用于您想要一起获取的实体。所以如果你有 - 'Meat''Vegetables'和'Fruits'实体,你可以为'Food'创建一个父抽象实体,然后获取'Food'实体中所有的甜实体。 这样你就可以得到所有甜美的'肉''蔬菜'和'水果'。

看这里: Entity Inheritance苹果文档。

+0

谢谢你的回复。我可能会坚持做两次抓取,因为这看起来会使当前的数据模型过度复杂化(我将不得不将现有的实体拆分为两个)。 –

1

Nikolay,

核心数据不是SQL系统。它有一个更原始的查询语言。虽然这似乎是一个赤字,但事实并非如此。它迫使你把东西带进RAM中,而不是在数据库中进行复杂的计算。 NSSet/NSMutableSet操作非常快速和有效。这也导致了一个更快的应用程序。 (这在iOS上闪光较慢且因此首选较大的情况下尤其明显。)

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

Shannoga的答案是解决您的问题的一个好方法。但是我不太了解你实际试图用你的数据模型来完成的事情,以判断使用实体继承是否是你的应用的正确路径。它可能不是。

来自服务器的SQL模式在CD应用程序中可能没有意义。查询语言以及数据在UI中的使用方式可能会强制使用不同的结构。 (例如,在iOS上使用抓取的结果控制器可能会强制您将数据非规范化,这与您在服务器上执行的操作不同)。

实体继承与OOP中的继承一样是一项僵化的技术。这很难改变。因此,我谨慎使用它。当我使用它时,我在某些取值中获得了性能,并在其他计算中获得了一些简化。在其他时候,这是错误的答案,性能明智。

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

Andrew

+0

谢谢你的回复。在SQL中我做别名,因为我需要sum [t1.amount + SUM(t2.amount)]。核心数据模型模仿SQL,因为,为什么我会重新设计它? (并且这两个模型可能需要在未来交换数据) 因此,在Core Data中执行相同操作的最明显方法是执行一次获取以获取值SUM(t2.amount),然后执行另一次获取该条目与t1.amount的条件匹配,之后我将运行一个循环并手动添加从第一次获取中获得的值。 –