原创Blog,转载请注明出处
blog.csdn.net/hello_hwc
欢迎关注我的iOS SDK详解专栏
http://blog.csdn.net/column/details/huangwenchen-ios-sdk.html
前言:
- CoreData不是DB,也不是DBMS,它是一个对象图管理工具,它的底层存储使用SQLite,XML或者其它。通常使用CoreData的时候,也会用到第三方库,比如MagicalRecord.
- SQLite则是一个DB,有自己的DB Engine,开发的时候直接使用SQL语句进行操作,实际开发通常使用第三方库,比如FMDB
本文更像是一个整理,整理一些我认为的和其它Google来的观点,供大家参考,所有参考的部分最后我都会列在参考链接里。
各自的优缺点(不可能完全涵盖,有读者看到了可以补充)
我对CoreData比较熟悉,SQLite相对来说差一点,所以这里CoreData可能会写的多一点。
CoreData的优点
- 对象图管理
- 惰性加载的支持(faulting and uniquing)
- 面向对象的编程,直观易用
- 良好的多线程支持(注意不是线程安全的)
- 支持redo和undo
- NSFetchedResultController使得与tableview结合编程变得很容易
- KVC与KVO的支持
- ICould的支持
- Apple 推荐的存储方式,API在不断升级
CoreData的缺点
- 学习成本高,要很久才能得心应手
- 对象Schema改变后,数据迁移比较棘手(当然也支持)
- 对于一次大量更新删除等操作效率较低(因为每次都要先取到内存里)
- 对主键的支持要自己去维护(CoreData 通过objectID来唯一确定对象)
- 占用内存会高一些(为了维护ManagedContext,为了跟踪对象变化)
直接使用SQLite的优点
- 学习成本相对较低(没有那么多的类要学,往往计算机或者软件背景的童鞋都有一些数据库知识,用过一些SQL语句)
- 直接使用SQLite引擎,对一次大批量数据的操作性能较好(只需要一个SQL语句即可)。
- 占用内存较少
- 更加轻量
- Android和WP也支持
直接使用SQLite的缺点
- 复杂的对象关系要自己维护
- 没有对象变化跟踪
- 并不是真正的面向对象编程
- 有待补充
性能方面评估
总体来说,假如底层都使用SQLite作为DB存储,性能没有太大差别。性能分析这部分源自于这篇文章,这篇文章分析了相同数目的数据量,CoreData和直接使用SQLite的比较
http://www.drdobbs.com/mobile/ios-data-storage-core-data-vs-sqlite/240168843?pgno=2
内存使用
占用磁盘大小
查询性能
如何选择
从上文的性能分析来看,随着iOS 设备硬件性能的越来越好,二者在性能上的大部分的时候差别已经不大。StackOverflow或者Google上的观点也越来越支持使用CoreData而不是直接使用SQLite。以下我就介绍下,如果是我来选择数据存储,如何去选择。
第一步,要明确一点,就是不管是CoreData还是直接使用SQLite,都是为了数据持久化,数据持久化的核心是存储的数据是什么。
第二步,分析自己的数据量,数据之间的关系,对数据的操作。优先考虑CoreData吧,因为你学会了真得会发现它非常好用,绝大部分App的数据量达不到CoreData性能瓶颈的时候。但是一下情况下,要考虑SQLite
- 跨平台。这点是CoreData不支持的,它是Cocoa的一部分,意味着是用C实现的,如果数据要迁移到Android或者PC,不要使用CoreData
- 一次大批量更新,删除数据。例如,有10000条存储,每个存储都有一个Bool值来表示一个状态,使用CoreData来操作的效率是很低的。
- 有待补充
CoreData遇到性能瓶颈了怎么办?
在这篇文章里,我简单介绍了如何使用Log以及性能评估工具来分析
绝大部分CoreData性能出问题的时候,都是因为使用不当。例如在主线程上进行大量数据操作。 出现问题了,优先去找解决办法,不管是StackOverflow还是Google,几乎所有的问题你遇到的别人都遇到过。另外,如果有时间,我十分推荐好好读读官网的文档,Core Data Programming Guide
最后在使用CoreData的时候,推荐三个库
- Mantle 对象与Json的转换
- MagicalRecord方便的创建堆栈
- RestKit,支持网络以及到CoreData的map
其它参考链接
http://stackoverflow.com/questions/523482/core-data-vs-sqlite-3
http://stackoverflow.com/questions/1318467/use-coredata-or-sqlite-on-iphone
版权声明:本文为博主原创文章,如需转载请注明出处