【问题标题】:Core Data vs. Database fundamental difference?核心数据与数据库的根本区别?
【发布时间】:2011-09-10 17:14:35
【问题描述】:

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

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

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

那么我在这里错过了什么?数据存储与数据库有什么根本不同,使得简单数据导入的概念对那些了解该技术的人来说完全陌生?

【问题讨论】:

    标签: database core-data


    【解决方案1】:

    Core Data 不像 SQL 那样简单地将数据持久化到磁盘或从磁盘存储数据。 Core Data 的真正功能是为 Apple API 使用的 Model-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 数据,然后从该数据生成托管对象,然后将它们保存到持久存储中。

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

    【讨论】:

      【解决方案2】:

      字典定义给了我: 数据库是数据存储,但数据存储并不总是数据库。

      您期望的功能在某些数据库中也不可用(但大多数都可用)。

      例如,数据存储可以存储非关系数据。

      【讨论】:

        【解决方案3】:

        他们应该只是将您指向Wikipedia article on Core Data

        根据那篇文章,“它允许将由关系实体属性模型组织的数据序列化为 XML、二进制或 SQLite 存储。可以使用表示实体及其关系的更高级别的对象来操作数据。核心数据管理序列化版本,提供对象生命周期和对象图管理,包括持久性。Core Data 直接与 SQLite 接口,将开发人员与底层 SQL 隔离开来。"

        我猜这是“Core Data 管理序列化版本”的事实,这意味着您不能直接导入数据。也就是说,您可能无法以 Core Data 可以管理的方式将数据直接导入 SQLite,尽管您可能可以some 方式将数据直接导入 SQLite .

        【讨论】:

          【解决方案4】:

          Core Data 不是数据存储,数据存储是 Core Data 的一部分。 Core Data 更接近于对象关系映射 (ORM) 工具。 Core Data 实际上可以选择使用 SQLite 作为其数据存储,但您也可以选择 XML 文件、专有格式或编写自己的数据存储。

          不确定如何通过 SQL 导入来导入数据,不应该与 Core Data 兼容,因为 Core Data 创建了一个包含大量元数据的专有 SQL 数据库架构。

          【讨论】:

          • 简单:虽然模式是专有的,但它并没有什么特别之处。一旦您让 Core Data 堆栈创建数据库,就很明显哪些表和列保存了实际数据,并且完全可以直接执行 .import FILE TABLE。您只需对数据进行(小)一点处理以匹配架构(列顺序等)。导入时其他数据无关紧要。
          【解决方案5】:

          也许将 Core Data 视为“对象存储”并将数据库视为“数据存储”会更好。当您拥有多种类型的对象并且彼此之间存在关系时,Core Data 非常有用。熟悉的例子是一家有员工的公司,他们有老板和报告,属于部门,分配给客户,项目等,有日程安排,参加会议。员工可能会被重新分配,等等。甚至定义的关系类型也会不时变化。即使使用 Core Data,这也是一个更重量级的过程,但 Core Data 比使用原始数据库更容易。

          如果你只有“数据”,而不是“对象”,那么使用数据库会更容易。例如,如果您只有一个包含原子量等元素的表格,您可能只想使用数据库。

          对于您的应用程序,听起来您只有一张桌子。使用 SQLite 会很容易,它是可用的,所以如果它更方便,请使用它。

          另一方面,iOS SDK 具有一些与 Core Data 交互的预构建功能。如果你使用 SQLite,你不会得到这些。因此,您可能会避免使用自定义代码来导入数据,但必须编写自定义代码来显示您的数据。倒霉。在创建软件时,有时您必须编写代码。很奇怪,我知道。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-09-23
            • 2018-01-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-11-12
            • 1970-01-01
            相关资源
            最近更新 更多