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

时间:2011-09-10 17:14:35

标签: database core-data

有人可以向我解释Core Data(显然是“数据存储”)与SQLite或MySQL等数据库之间的根本区别是什么?

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

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

那我在这里错过了什么?数据库中的数据存储是如何根本不同的,这使得简单数据导入的概念与那些了解该技术的人完全不同?

5 个答案:

答案 0 :(得分:6)

核心数据不仅仅是像SQL一样在磁盘上保存/存储数据的方法。 Core Data的真正功能是为Apple API使用的Model-View-Controller应用程序设计提供完整的模型层。因此,Core Data主要是一个对象图管理器,其持久性选项可以支持。

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

核心数据确实提供了持久性选项,但确切地说,该选项对于任何特定实现的确切隐藏。您甚至可以在同一个应用程序中使用具有不同持久性方法的相同数据模型和托管对象。

与SQL的主要区别在于SQL将实际数据写入磁盘,而Core Data序列化活动对象。当您查看Core Data中的sqlite存储时,您正在查看已拆开并“冻干”的对象。显然,“冻干”对象需要在sqlite存储中使用相当具体的数据格式,因此Core Data存储使用自己的自定义模式,无论商店的详细信息如何,都会大致相同。

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

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

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

答案 1 :(得分:0)

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

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

数据存储可以存储非关系数据。

答案 2 :(得分:0)

核心数据不是数据存储,数据存储是核心数据的一部分。核心数据与对象关系映射(ORM)工具更紧密相关。 Core Data实际上可以选择将SQLite用于其数据存储区,但您也可以选择XML文件,专有格式或编写自己的数据存储区。

由于Core Data创建了包含大量元数据的专有SQL数据库架构,因此不确定如何使用SQL导入导入数据,因此不应与Core Data兼容。

答案 3 :(得分:0)

他们应该刚刚指出Wikipedia article on Core Data

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

我想这是“核心数据管理序列化版本”的事实,这意味着您无法直接导入数据。也就是说,您可能无法将数据直接导入SQLite,以便Core Data可以管理它,尽管您可能可以 某种方式将数据直接导入SQLite

答案 4 :(得分:0)

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

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

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

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