【问题标题】:Core Data vs SQLite 3 [closed]核心数据与 SQLite 3 [关闭]
【发布时间】:2010-10-06 03:02:46
【问题描述】:

我已经非常熟悉关系数据库并且过去使用过SQLite(和其他数据库)。但是,Core Data 有一定的吸引力,所以我正在考虑花一些时间来学习它,以便在我的下一个应用程序中使用它。

在 SQLite 上使用 Core Data 有什么好处,反之亦然?各有什么优缺点?

当 Apple 不将 Core Data 用于其许多旗舰应用程序(如 Mail.app 或 iPhoto.app)时,我发现很难证明学习 Core Data 的成本是合理的,而是选择了 SQLite 数据库。 SQLite 也在 iPhone 上广泛使用。

熟悉使用这两种方法的人可以评论他们的经验吗?也许,与大多数事情一样,问题比仅仅使用一个比另一个更深?

【问题讨论】:

  • 能否为不知道那是什么的每个人添加一个指向en.wikipedia.org/wiki/Core_Data 的链接。
  • 请注意,Core Data 不是,不应用作数据库!

标签: cocoa macos core-data sqlite


【解决方案1】:

虽然 Core Data 是 Apple 的 Enterprise Object Framework 的后代,它是一种对象关系映射器 (ORM),与关系后端紧密相关,但 Core Data 不是 ORM。事实上,它是一个对象图管理框架。它管理一个可能非常大的对象实例图,允许应用程序通过根据需要对内存中的对象进行故障排除来处理无法完全放入内存的图。 Core Data 还管理对属性和关系的约束并维护引用完整性(例如,当对象被添加到关系中/从关系中删除时,保持前向和后向链接的一致性)。因此,Core Data 是构建 MVC 架构的“模型”组件的理想框架。

为了实现其图形管理,Core Data碰巧使用 SQLite 作为磁盘存储。它可以使用不同的关系数据库甚至非关系数据库(例如CouchDB)来实现。正如其他人所指出的,Core Data 还可以使用 XML 或二进制格式或用户编写的原子格式作为后端(尽管这些选项要求整个对象图适合内存)。如果您对如何在 SQLite 后端实现 Core Data 感兴趣,您可能需要查看 OmniGroup 的 OmniDataObjects 框架,它是 Core Data API 子集的开源实现。 BaseTen 框架也是使用 PostgreSQL 作为后端的 Core Data API 的实现。

因为 Core Data 不打算成为 SQLite 的 ORM,所以它不能读取任意 SQLite 模式。相反,您不应该依赖能够使用其他 SQLite 工具读取 Core Data 的 SQLite 数据存储;架构是一个可能会改变的实现细节。

因此,直接使用 Core Data 或 SQLite 之间并没有真正的冲突。如果您想要一个关系数据库,请使用 SQLite(直接或通过 Objective-C 包装器之一,例如 FMDB)或关系数据库服务器。但是,您可能仍想学习 Core Data 以用作对象图管理框架。结合 Apple 的控制器类和键值绑定兼容的视图小部件,您可以用非常很少的代码实现完整的 MVC 架构。

【讨论】:

  • 优秀的答案。 FMDB 已移至 github -- github.com/ccgus/fmdb -- 并被 NetNewsWire 开发人员推荐:inessential.com/2010/02/26/on_switching_away_from_core_data
  • 在 iOS 5.0 中,如果您使用的是 Core Data,您还可以获得免费使用 iCloud 文件同步的额外好处。如果您直接使用 SQLite,则必须进行大量手动修改和实施才能使其在 iCloud 上同步。
  • 试试 www.github.com/pmurphyjam/DBExample 这是一个使用 SQLite 的 Xcode 项目。
【解决方案2】:

在 iOS 5.0 中,如果您使用 Core Data,您还可以获得免费使用 iCloud 文件同步的额外好处。如果您直接使用 SQLite,则必须进行大量手动修改和实施才能使其在 iCloud 上同步。

【讨论】:

【解决方案3】:

Core Data 与其说是一个数据库引擎,不如说是一个对实际数据存储进行抽象的 API。您可以告诉 Core Data 保存为 sqlite 数据库、plist、二进制文件,甚至是自定义数据存储类型。

我建议学习 Core Data,因为它是一个极好的资源,可以极大地加速可可应用程序开发的许多部分。

【讨论】:

    【解决方案4】:

    SQLite 是 Core Data 的数据库格式之一。使用 Core Data,您可以更好地与 Cocoa API 的其余部分集成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-21
      • 1970-01-01
      • 1970-01-01
      • 2013-04-02
      • 2011-10-03
      • 2014-01-27
      • 2010-11-05
      相关资源
      最近更新 更多