iOS 持久化存储之CoreData VS 直接SQlite

原创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 持久化存储之CoreData VS 直接SQlite_第1张图片

占用磁盘大小
iOS 持久化存储之CoreData VS 直接SQlite_第2张图片

查询性能
iOS 持久化存储之CoreData VS 直接SQlite_第3张图片

如何选择

从上文的性能分析来看,随着iOS 设备硬件性能的越来越好,二者在性能上的大部分的时候差别已经不大。StackOverflow或者Google上的观点也越来越支持使用CoreData而不是直接使用SQLite。以下我就介绍下,如果是我来选择数据存储,如何去选择。

第一步,要明确一点,就是不管是CoreData还是直接使用SQLite,都是为了数据持久化,数据持久化的核心是存储的数据是什么。

第二步,分析自己的数据量,数据之间的关系,对数据的操作。优先考虑CoreData吧,因为你学会了真得会发现它非常好用,绝大部分App的数据量达不到CoreData性能瓶颈的时候。但是一下情况下,要考虑SQLite

  • 跨平台。这点是CoreData不支持的,它是Cocoa的一部分,意味着是用C实现的,如果数据要迁移到Android或者PC,不要使用CoreData
  • 一次大批量更新,删除数据。例如,有10000条存储,每个存储都有一个Bool值来表示一个状态,使用CoreData来操作的效率是很低的。
  • 有待补充

CoreData遇到性能瓶颈了怎么办?

在这篇文章里,我简单介绍了如何使用Log以及性能评估工具来分析
CoreData性能相关

绝大部分CoreData性能出问题的时候,都是因为使用不当。例如在主线程上进行大量数据操作。 出现问题了,优先去找解决办法,不管是StackOverflow还是Google,几乎所有的问题你遇到的别人都遇到过。另外,如果有时间,我十分推荐好好读读官网的文档,Core Data Programming Guide

最后在使用CoreData的时候,推荐三个库

  • Mantle 对象与Json的转换
  • MagicalRecord方便的创建堆栈
  • RestKit,支持网络以及到CoreData的map

其它参考链接

http://objccn.io/issue-4-3/
http://stackoverflow.com/questions/523482/core-data-vs-sqlite-3
http://stackoverflow.com/questions/1318467/use-coredata-or-sqlite-on-iphone

你可能感兴趣的:(ios,sqlite,coredata)