核心数据与SQLite 3

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

通过SQLite使用Core Data有什么好处,反之亦然? 每个的优点/缺点是什么?

我发现当苹果公司没有将其用于诸如Mail.app或iPhoto.app这样的旗舰应用程序时,很难证明学习Core Data的成本 – 而是选择了SQLite数据库。 SQLite也广泛用于iPhone上。

那些熟悉这两者的人可以评论一下他们的经验吗? 也许和大多数事情一样,这个问题比只使用一个更深。

尽管核心数据是苹果公司的企业对象框架的后代,但与关系后端紧密相关的对象关系映射器(ORM),核心数据并不是一个ORM。 事实上,它是一个对象图管理框架。 它管理对象实例的一个潜在的非常大的图,允许一个应用程序使用一个图表,这个图表不会根据需要通过错误的对象进入和退出内存。 核心数据还管理对属性和关系的约束,以及维护引用完整性(例如,当对象被添加到/从关系中移除时,前向和后向链接保持一致)。 因此核心数据是构建MVC体系结构的“模型”组件的理想框架。

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

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

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

而在iOS 5.0中,如果您使用的是核心数据,则可以免费使用iCloud文件同步。 如果您直接使用SQLite,则必须进行大量手动修补和实施才能使其跨越iCloud进行同步。

核心数据不是一个数据库引擎,因为它是抽象出实际数据存储的API。 你可以告诉核心数据保存为一个SQLite数据库,plist,二进制文件,甚至自定义数据存储类型。

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

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