您的位置:首页 > 数据库

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

2015-07-12 11:03 495 查看
原创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性能相关


绝大部分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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: