在Core Data中写入原生SQL

我需要在我的项目中使用核心数据时编写一个本机SQL查询。 我真的需要这样做,因为我现在正在使用NSPredicate ,效率不够(仅仅是一个例子)。 我只需要编写几个子查询和连接来获取大量的行并按特殊字段sorting。 特别是,我需要用他们的孩子的价值的总和来分类。 现在我正在使用NSPredicate获取所有内容,然后手动对结果(数组)进行sorting,但是由于有成千上万个结果,所以这个过程需要很长时间。

请纠正我,如果我错了,但我敢肯定,这不是一个巨大的挑战,因为有一种在iOS应用程序中使用SQLite的方式。

如果有人能指引我走向正确的方向,那将是非常棒的。 提前致谢。

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

Coredata模型

下面是我在iPad上看到的结果: iPad截图

我为每位顾客展示了一张表,每位顾客在2012年1月至6月(最后一个)和2013年(库尔)的销售量都是相同的。 在Curr旁边有这两个值之间的差异。 毛利率和覆盖率同样如此。

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

所以为了显示这些结果,我要做的是在2013年1月到6月之间获取所有PbsRows ,然后执行此操作:

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

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

这个想法是获得当年的销售金额,并将其与去年进行比较。 坏消息是有很多客户, for -loop需要很长的时间:-(

这是一个黑客,但是… SQLite图书馆是能够打开一个以上的数据库文件在给定的时间。 使用SQLite直接打开核心数据DB文件(只读/使用)将是非常可行的,并打开第二个文件(报告/临时表)。 然后可以对Core Data DB中的数据执行直接的SQL查询,并将其保存到第二个文件(如果需要持久化)。

我做了几次这样的事情。 SQLite库中提供的function(例如:全文search引擎)不通过Core Data公开。

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

长的答案:核心数据本身不是一个数据库 – 它不保证有任何关系支持它,更不用说可以查询的特定版本的SQLite。 此外,在Core Data的持久性存储文件中散布是一种灾难,尤其是如果苹果决定以某种方式更改该文件的格式。 您应该尝试find更好的方式来优化您对NSPredicate的使用,或者开始caching您关心自己的值。

你有没有考虑过使用KVC收集操作员? 例如,如果你有一个实体Foo每个都有一堆儿童Bar ,而那些Bar有一个Baz整数值,我想你可以通过这样的方式得到每个Foo的总和:

 foo.bars.@sum.baz 

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

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

要查看Core Data执行的SQL命令,将add -com.apple.CoreData.SQLDebug 1添加到“启动时通过的参数”。 请注意,这不应该引诱你使用自己的SQL命令,只是为了debugging目的。