我已经非常熟悉关系数据库,并且过去曾使用SQLite(和其他数据库).但是,Core Data具有一定的吸引力,因此我正在考虑花一些时间来学习它以用于我的下一个应用程序.
使用Core Data而不是SQLite有什么好处,反之亦然?每个的优点/缺点是什么?
当Apple没有将它用于许多旗舰应用程序(如Mail.app或iPhoto.app)时,我发现很难证明学习Core Data的成本是合理的 - 而是选择了SQLite数据库.SQLite也广泛用于iPhone.
那些熟悉使用它们的人可以评论他们的经历吗?或许,与大多数事情一样,问题比仅仅使用一个而不是另一个问题更深层次?
尽管Core Data是Apple 企业对象框架的后代,但是对象关系映射器(ORM)与关系后端紧密相关,Core Data 不是 ORM.事实上,它是一个对象图管理框架.它管理一个可能非常大的对象实例图,允许应用程序使用一个图形,该图形根据需要通过故障对象进出内存而不能完全适合内存.核心数据还管理对属性和关系的约束,并维护参考完整性(例如,在向关系添加/删除对象时保持向前和向后链接一致).因此,核心数据是构建MVC架构的"模型"组件的理想框架.
为了实现其图形管理,Core Data 恰好使用SQLite作为磁盘存储.它可以使用不同的关系数据库甚至是非关系型数据库(如CouchDB)来实现.正如其他人所指出的,Core Data也可以使用XML或二进制格式或用户编写的原子格式作为后端(尽管这些选项要求整个对象图适合内存).如果您对如何在SQLite后端实现Core Data感兴趣,您可能需要查看OmniGroup的OmniDataObjects框架,这是Core Data API子集的开源实现.所述BaseTen框架也使用PostgreSQL作为后端核心数据API的实现.
由于Core Data并非旨在成为SQLite的ORM,因此无法读取任意SQLite架构.相反,您不应该依赖于能够使用其他SQLite工具读取Core Data的SQLite数据存储; 架构是可能会更改的实现细节.
因此,直接使用Core Data或SQLite之间并没有任何冲突.如果需要关系数据库,请使用SQLite(直接或通过其中一个Objective-C包装器,如FMDB)或关系数据库服务器.但是,您可能仍希望学习Core Data以用作对象图管理框架.结合Apple的控制器类和键值绑定兼容的视图小部件,您可以使用非常少的代码实现完整的MVC架构.
使用iOS 5.0,您可以获得额外的好处,即如果您使用的是Core Data,则可以免费使用iCloud文件同步.如果您直接使用SQLite,则必须进行大量的手动修改和实施才能使其在iCloud中同步.
核心数据不是一个数据库引擎,而是一个在实际数据存储上抽象的API.您可以将Core Data保存为sqlite数据库,plist,二进制文件甚至自定义数据存储类型.
我建议学习核心数据,因为它是一个很好的资源,大大加速了可可应用程序开发的许多部分.
SQLite是Core Data的数据库格式之一.使用Core Data可以更好地与Cocoa API的其余部分集成.