database - 核心数据与数据库的根本区别?

标签 database core-data

谁能给我解释一下 Core Data(显然是“数据存储”)和 SQLite 或 MySQL 等数据库之间的根本区别是什么?

我正在编写一个 iPhone 应用程序,需要一个静态数据表来显示。我认为核心数据将是一个不错的选择,所以我就数据库(对不起 - 数据存储)进行了所有设置和运行,然后尝试导入我的数据(它在一个我导出到 CSV 的 excel 文件)。我认为这应该是一个直接的过程,就像我在 SQLite 和其他数据库中做过很多次一样,但经过大量研究后发现,唯一的“官方”方法是专门为我的数据编写一个解析器。

当我在 Apple Developer 论坛上询问这个问题时,我得到的回复基本上是“你是哪种白痴,认为你可以直接导入数据而无需编写代码来完成它?核心数据不是一个数据库——它是一个数据存储!!”但是,就我的生活而言,我看不出区别。从各个方面来看,核心数据的行为都非常像数据库,具有奇特的访问方式和足够的抽象,可以使用各种文件格式来实际存储数据。事实上,我最终能够使用一个简单的 SQLite .import 命令导入我的数据,所以我真的不明白为什么这个概念对于我最初问题的响应者来说如此陌生。

那么我在这里缺少什么?数据存储与数据库的根本区别是什么使得简单数据导入的概念对于了解该技术的人来说完全陌生?

最佳答案

Core Data 不像 SQL 那样只是一种将数据持久化/存储到磁盘或从磁盘存储数据的方法。 Core Data 的真正功能是为 Apple API 使用的模型- View - Controller 应用程序设计提供完整的模型层。因此,Core Data 主要是一个带有持久化选项的对象图管理器。

对象图是内存中事件对象的集合。在 Core Data 中,这些是托管对象。它们被称为“托管”对象,因为托管对象上下文不断观察对象,确保它们处于数据模型规定的状态和关系中。

Core Data 确实提供了持久化选项,但是对于任何特定的实现来说,这个选项到底是什么在很大程度上是隐藏的。您有时甚至可以在同一个应用程序中使用具有不同持久化方法的相同数据模型和托管对象。

与 SQL 的主要区别在于,SQL 将实际数据写入磁盘,而 Core Data 序列化事件对象。当您查看 Core Data 中的 sqlite 存储时,您正在查看已拆开并“冷冻干燥”的对象。显然,“冷冻干燥”对象在 sqlite 存储中需要一种相当特定的数据格式,因此 Core Data 存储使用其自己的自定义模式,无论存储的细节如何,该模式在很大程度上是相同的。

这就是为什么您不能只交换任何旧的 SQL 文件并期望 Core Data 导入它的原因。 SQL 文件是数据的行、表和列,而不是专门用于重构冻干对象的表、列和行。

由于 Core Data 首先是一个对象图管理器,因此唯一受支持且可靠的数据导入方式是创建对象图。对于 SQL 文件,这意味着使用 SQL api 读取 SQL 数据,然后从该数据生成托管对象,然后将它们保存到持久存储中。

这部分工作量更大,但您可以节省时间将数据集成到应用程序的其余部分、升级数据并提高可靠性和可维护性。

关于database - 核心数据与数据库的根本区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7373281/

相关文章:

mysql - MySQL数据库管理器

database - 如何存储公共(public)交通数据

c# - 使用 C# 将多行插入到 MS Sql Server

ios - 如何选择核心数据中的特定列?

ios - Swift 3 核心数据 "Entity"错误 : `Use of undeclared type`

objective-c - [NSManagedObject 打招呼] : unrecognized selector sent to instance 0x

sql - 合并语句在尝试合并两个表时在 oracle 上给出错误

sql - 通过了解 SQL 脚本中的信息来检索数据

ios - 如何使用应用程序组与多个应用程序(不仅仅是扩展)共享核心数据并避免损坏核心数据存储?

ios - 当 CoreData Swift 中已存在记录时,函数不返回