Core Data vs SQLite 3

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

在SQLite上使用Core Data是否有很大的好处,反之亦然?它们各自的优点和缺点是什么?

我发现很难证明学习Core Data的成本是合理的,因为苹果的许多旗舰应用程序(如Mail)都没有使用Core Data。app或iPhoto。app -而不是选择SQLite数据库。SQLite在iPhone上也被广泛使用。

熟悉使用这两种方法的人能谈谈他们的经验吗?也许,就像大多数事情一样,这个问题比仅仅使用一种而不是另一种更深刻?

94284 次浏览

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

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

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

虽然Core Data是Apple的企业对象框架的后代,它是一个对象-关系映射器(ORM),过去/现在紧密地绑定到关系后端,但Core Data是一个ORM。实际上,它是一个对象图管理框架。它管理一个潜在的非常大的对象实例图,允许应用程序工作在一个不完全适合内存的图中,根据需要将对象错误地放入和取出内存。Core Data还管理属性和关系上的约束,并维护引用完整性(例如,当对象添加/删除到关系中/从关系中删除时,向前和向后链接保持一致)。因此Core Data是构建MVC架构的“模型”组件的理想框架。

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

因为Core Data不是SQLite的ORM,所以它不能读取任意SQLite模式。相反,你不应该依赖于能够读取Core Data的SQLite数据存储与其他SQLite工具;模式是一个可能改变的实现细节。

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

在iOS 5.0中,如果你使用的是Core Data,你还可以免费使用iCloud文件同步。如果你直接使用SQLite,那就需要大量的手工修改和实现才能在iCloud上实现同步。