2

在我的项目中使用 Core Data 时,我需要编写一个原生 SQL 查询。我真的需要这样做,因为我现在正在使用NSPredicate它并且效率不够高(仅在一种情况下)。我只需要编写几个子查询和连接来获取大量行并按特殊字段对它们进行排序。特别是,我需要按其子实体的值总和对其进行排序。现在我正在使用 NSPredicate 获取所有内容,然后手动对结果(数组)进行排序,但这需要很长时间,因为有成千上万的结果。

如果我错了,请纠正我,但我很确定这不会是一个巨大的挑战,因为有一种在 iOS 应用程序中使用 sqlite 的方法。

如果有人能引导我走向正确的方向,那就太棒了。提前致谢。

编辑: 让我解释一下我在做什么。这是我的 Coredata 模型:

核心数据模型

这是我的结果在 iPad 上的样子: iPad截图

我展示了一个表格,其中每个客户都有一行,其中每个客户都有他从 2012 年 1 月到 2012 年 6 月(最后)和 2013 年(当前)的销售额。旁边是Curr这两个值之间的差异。毛利率和覆盖率也是如此。

每个客户都保存在Kunde表中,每个客户Kunde都有几个PbsRows。PbsRow实际上持有每月销售额的总和。

因此,为了显示这些结果,我正在做的是获取PbsRows2013 年 1 月至 2013 年 6 月之间的所有数据,然后执行以下操作:

self.kunden = [NSMutableOrderedSet orderedSetWithArray:[pbsRows valueForKeyPath:@"kunde"]];

现在我的所有客户 (Kunde) 都有 2013 年 1 月到 2013 年 6 月之间的记录。然后我使用 for 循环来计算每个客户的总和。

这个想法是获取当年的销售额并将它们与去年进行比较。坏事是有很多客户,而且for-loop 只需要很长时间:-(

4

3 回答 3

3

这有点 hack,但是... SQLite 库能够在给定时间打开多个数据库文件。直接使用 SQLite 打开 Core Data DB 文件(只读/只读使用)并结合此文件(报告/临时表)打开第二个文件是非常可行的。然后可以对 Core Data DB 中的数据执行直接 SQL 查询并将它们持久化到第二个文件中(如果需要持久性)。

我做过几次这样的事情。SQLite 库中的一些可用功能(例如:全文搜索引擎)并未通过 Core Data 公开。

于 2013-08-29T15:33:42.167 回答
2

如果您想使用 Core Data,则不支持执行 SQL 查询的方法。您可以获取特定值[NSExpression expressionForFunction:arguments:]sum:函数一起使用。

要查看 Core Data 执行的 SQL 命令,请添加-com.apple.CoreData.SQLDebug 1到“Arguments Passed on Launch”。请注意,这不应诱使您自己使用 SQL 命令,它只是用于调试目的。

于 2013-08-29T13:53:50.410 回答
0

简短的回答:你不能这样做。

长答案:Core Data 本身并不是一个数据库——它不能保证有任何关系支持它,更不用说你可以查询的特定版本的 SQLite。此外,在 Core Data 的持久性存储文件中乱搞是灾难的根源,尤其是如果 Apple 决定以某种方式更改该文件的格式。相反,您应该尝试找到更好的方法来优化您对 NSPredicate 的使用或开始缓存您自己关心的值。

您是否考虑过使用 KVC 集合运算符?例如,如果您有一个实体,Foo每个实体都有一堆 children Bar,并且这些Bars 有一个Baz整数值,我认为您可以Foo通过执行以下操作来获得每个实体的总和:

foo.bars.@sum.baz

不确定这些是否适用于谓词,但值得研究

于 2013-08-29T12:40:07.313 回答