SQLite vs Core Data:保存大量数据

Posted

技术标签:

【中文标题】SQLite vs Core Data:保存大量数据【英文标题】:SQLite vs Core Data: saving large amounts of data 【发布时间】:2015-02-21 16:35:35 【问题描述】:

我正在制作一个需要在本地存储大量数据的统计分析应用。为了让您了解我在说什么,我制作了这个插图(信息不完全正确,但非常相似):

该应用程序将跟踪数千个目的地,包括目的地人口、温度、汽车数量等。这些数字将显示在图表中,以便您可以查看随着时间的推移“发展”的数字。这将持续很长一段时间,换句话说:每数千个城市的每种数据类型都有数千个日期。

为了实现这一点,我需要保存大量数据,并且最好在本地完成(这很疯狂吗?)。我在深入挖掘核心数据的基础和使用我在 SQLite 中已经不错的技能之间陷入困境。

如果您建议我应该使用 SQLite,您能否参考一下您将如何在您的应用程序中实现它(可能是一些代码?)。

如果您建议我应该使用核心数据(主要是为了性能),请告诉我您将如何使用实体、属性、关系等实现这种类型的数据模型。我可以想象使用保存在核心数据中的字典将是一个好的解决方案?

提前谢谢你。

【问题讨论】:

仅供参考:“深入挖掘核心数据的基础”核心数据一旦设置就非常易于使用。 @LyndseyScott 我已经“设置”了,但我仍然不明白例如关系。 如果您熟悉 SQLite,我认为没有理由切换到 Core Data。我们直接使用 SQLite 的原因之一是我们可以轻松地将数据库发送到 android 设备并在那里读取它。我喜欢 FMDB 作为 SQLite 之上的简单 Objective-C 包装器。 【参考方案1】:

如果您要使用带有 Swift 的 SQLite - 我强烈建议使用 this 项目。我在我当前的项目中使用它,它非常棒并且完美运行(我与项目或作者没有任何关系)。您实际上将该项目拖到您的项目中并成为一个子项目,然后您只需将其设置为 1. 目标依赖项,2. 要链接的框架,3. 复制框架(构建阶段),它就可以工作了。然后,您可以使用构造精巧的 Swift 接口而不是丑陋繁琐的 libsqlite 调用来处理您的数据库。

我已将它用于少量数据。几个数据库和多个表。干净直观。到目前为止,我还没有发现任何类型的错误。当我询问有关未记录的功能(但事实证明确实存在并且有效)的问题时,作者斯蒂芬·塞利斯(Stephen Celis)做出了回应。这是一项了不起的努力。

它是如此简洁且与 Swift 紧密集成,如果我不了解的话,我认为 Apple 自己在 Swift 语言中添加了 SQLite 支持。

https://github.com/stephencelis/SQLite.swift

【讨论】:

我关心的一个问题是排序和查询语言。我现在正在使用 Core Data,但是构建查询语言似乎很难,我想要全文搜索,按相关性排序,SQLite 可以吗?我使用的是 mysql,SQLite 和它类似吗? @TomSawyer - 抱歉,去年 12 月我没有回复您,一定是错过了通知。是的,SQLite 与 MySQL 有很多相似之处,但显然更轻。但是,如果您熟悉前者,那么直接使用 SQLite 应该没有问题。【参考方案2】:

Core Data 是一个对象持久性模型——这就是你的答案,因为每个对象都有一点开销,所以一次在内存中拥有数千个对象是有问题的。如果您已经了解 SQL,那么这是另一个优点。

(关于核心数据的整体优点的讨论超出了这个问题的范围。我认为“音乐”应用程序使用包含数千个项目的核心数据来实现它,但因为它只需要显示项目的一个子集。 Map Kit 降到 C 级,并且可以很好地处理数万个个位数字节项目,您可以看到使用 Map Kit 应用程序运行仪器。)

我在 ios 中使用过 SQLite,这不是问题,因为它是基于 C 的,而 Objective C 是 C 的严格超集。有各种“包装器”,但请仔细查看它们,以防它们带你回到每一个-行对象。我没有使用,发现 SQLite C 设置很棘手但很好。编辑:我使用了this tutorial,它现在已经过时用于Objective C,但清楚地概述了如何集成SQLite。

唯一的问题是,如果您提供大量数据并希望保存到该数据库,iOS 中的 bundle/documents 区别会抓住您:您无法修改 bundle 中的文件,因此您需要创建或复制一个 SQL 数据库到文档文件夹 1 次,可能在第一次启动应用程序时使用它。由于您无法从捆绑包中删除,因此您现在拥有两次数据库。 iOS设置方式固有的问题。

【讨论】:

以上是关于SQLite vs Core Data:保存大量数据的主要内容,如果未能解决你的问题,请参考以下文章

将 Core Data 数据库保存到 sqlite 文件会丢失一些递归/循环关系信息

如何使用 SQLite 文件预加载 Core Data,该文件引用使用“外部存储”保存的图像?

Core Data SQLite 存储在更新后变为只读

Plain Core Data vs Core Data + Magical Record

Core Data 没有第一次保存

JSON文件VS SQLite android