核心数据与SQLite 3

时间:2009-02-07 09:05:09

标签: cocoa macos core-data sqlite

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

使用Core Data而不是SQLite有什么好处,反之亦然?每个人的利弊是什么?

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

那些熟悉使用两者评论他们的经验吗?也许,就像大多数事情一样,问题比仅仅使用一个而不是更深层次?

4 个答案:

答案 0 :(得分:279)

虽然Core Data是Apple的Enterprise Object Framework的后代,但是对象关系映射器(ORM)与关系后端紧密相关,Core Data 是ORM。事实上,它是一个对象图管理框架。它管理一个可能非常大的对象实例图,允许应用程序使用一个图形,该图形根据需要通过故障对象进出内存而不能完全适合内存。核心数据还管理对属性和关系的约束,并维护参考完整性(例如,当向/从关系添加/移除对象时保持前向和后向链接一致)。因此,核心数据是构建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架构。

答案 1 :(得分:46)

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

答案 2 :(得分:35)

核心数据不是一个数据库引擎,而是一个在实际数据存储上抽象的API。您可以将Core Data保存为sqlite数据库,plist,二进制文件甚至自定义数据存储类型。

我建议学习核心数据,因为它是一个很好的资源,可以大大加速可可应用程序开发的许多部分。

答案 3 :(得分:13)

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