【问题标题】:Write native SQL in Core Data在 Core Data 中编写原生 SQL
【发布时间】:2013-08-29 23:33:42
【问题描述】:

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

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

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

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

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

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

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

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

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

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

我们的想法是获取当年的销售额并将其与去年进行比较。 不好的是有很多客户,for-loop 只需要很长时间:-(

【问题讨论】:

    标签: ios sqlite core-data native-sql


    【解决方案1】:

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

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

    【讨论】:

    • FMDB 库 (github.com/ccgus/fmdb) 有一些非常不错的功能,如果您打算直接使用 SQLite,值得一看。
    • 您的意思是通过应用程序访问 sqlite 文件(由核心数据创建)还是物理定位该文件并将其添加到项目目录?
    【解决方案2】:

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

    要查看 Core Data 执行哪些 SQL 命令,请将 -com.apple.CoreData.SQLDebug 1 添加到“启动时传递的参数”。请注意,这应该诱使您自己使用 SQL 命令,这只是为了调试目的。

    【讨论】:

      【解决方案3】:

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

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

      您是否考虑过使用 KVC 集合运算符?例如,如果您有一个实体Foo,每个实体都有一堆孩子Bar,而那些Bars 有一个Baz 整数值,我认为您可以通过以下方式获得每个Foo 的总和做类似的事情:

      foo.bars.@sum.baz
      

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

      【讨论】:

      • 感谢您的回答。我已经编辑了我的问题,以便更详细地说明我正在尝试做的事情。在我的情况下,我真的不能使用 KVC
      猜你喜欢
      • 2017-05-13
      • 2012-07-05
      • 2011-09-04
      • 2017-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-03
      • 2020-01-11
      相关资源
      最近更新 更多