在Core Data中写入原生SQL
我需要在我的项目中使用核心数据时编写一个本机SQL查询。 我真的需要这样做,因为我现在正在使用NSPredicate
,效率不够(仅仅是一个例子)。 我只需要编写几个子查询和连接来获取大量的行并按特殊字段sorting。 特别是,我需要用他们的孩子的价值的总和来分类。 现在我正在使用NSPredicate获取所有内容,然后手动对结果(数组)进行sorting,但是由于有成千上万个结果,所以这个过程需要很长时间。
请纠正我,如果我错了,但我敢肯定,这不是一个巨大的挑战,因为有一种在iOS应用程序中使用SQLite的方式。
如果有人能指引我走向正确的方向,那将是非常棒的。 提前致谢。
编辑:让我解释我在做什么。 这是我的Coredata模型:
下面是我在iPad上看到的结果:
我为每位顾客展示了一张表,每位顾客在2012年1月至6月(最后一个)和2013年(库尔)的销售量都是相同的。 在Curr
旁边有这两个值之间的差异。 毛利率和覆盖率同样如此。
每个客户都保存在Kunde
表中,每个Kunde
都有几个PbsRow
。 PbsRow
实际上持有每月销售额的总和。
所以为了显示这些结果,我要做的是在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目的。
- NSFetchedResultsController不总是调用didChangeObject:atIndexPath:forChangeType:newIndexPath:for NSFetchedResultsChangeMove
- 核心数据逆关系没有被设置
- NSFetchedResultsController是否观察到永久存储的所有更改?
- 核心数据谓词:谓词未实现的SQL生成
- iOS:什么是迁移coredata关系时的值expression式函数?
- 核心数据:如何删除和重build数据存储?
- iPhone核心数据“自动轻量级迁移”
- 当从Child ManagedObjectContext和Parent ManagedObjectContext保存时,CoreDataTableView不更新
- 合并后台线程更新后,NSFetchedResultsController不会触发委托方法