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 设备硬件性能的越来越好,二者在性能上的大部分的时候差别已经不大。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的时候,推荐三个库


其它参考链接

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

版权声明:本文为博主原创文章,如需转载请注明出处

时间: 2024-10-13 00:18:06

iOS 持久化存储之CoreData VS 直接SQlite的相关文章

iOS数据存储之CoreData

iOS中大量数据的储存一个是SqLite,另一个就是CoreData,CoreData允许程序员以面向对象的思维方式的方法去操作面向表的数据库 做过Java开发的对这个应该很熟悉,Java中的Hibernate跟CoreData就很相似 CoreData应该怎样使用呢? 第一步,新建工程后导入CoreData框架 第二部,创建CoreData的数据模型创建步骤如下 然后给你的model起个名字,创建完成后你会看到一个这个文件(相当于数据库文件) 点击这个文件,然后看下图 点击图中1,新建实体(类

iOS持久化存储

如何将数据持久化存储在iOS系统上,Cocoa提供了4种机制:1 NSUserdefaults主要用来存储一些短小的信息,例如应用程序设置和属性及用户数据.2 属性列表以列表的形式把数据存储到磁盘上.属性列表类包括NSArray, NSDictionary, NSString, NSNumber, NSDate, NSdata.这些类型的数据可用直接调用writeToFile和相应的加载函数来存储到磁盘和从磁盘读出.相应的加载函数有:arrayWithContentsOfFile:diction

IOS数据存储之CoreData使用

前言: 学习了Sqlite数据之后认真思考了一下,对于已经习惯使用orm数据的开发者或者对sql语句小白的开发者来说该如何做好数据库开发呢?这个上网搜了一下?看来总李多虑了!apple 提供了一种数据方式,它就是今天的主角:CoreData CoreData介绍: Core Date是ios3.0后引入的数据持久化解决方案,它是是苹果官方推荐使用的,不需要借助第三方框架.Core Date实际上是对SQLite的封装,提供了更高级的持久化方式.在对数据库操作时,不需要使用sql语句,也就意味着即

[Xcode10 实际操作]七、文件与数据-(14)数据持久化存储框架CoreData的使用:删除CoreData中的数据

本文将演示如何删除数据持久化对象. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] 1 import UIKit 2 //引入数据持久化存储框架[CoreData] 3 import CoreData 4 5 class ViewController: UIViewController { 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional setup a

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

iOS开发之数据持久化存储

概论 数据持久化存储:所谓持久化存储就是将数据保存到硬盘中,使得应用程序或者机器在重启后可以访问之前保存的数据. 常见方式: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite3(数据库) CoreData(苹果基于数据库封装的持久化存储工具,这种方式效率不高,因为会帮我们动态生成很多重复的代码,我只有写XMPP的时候会用一下,因为XMPP里面的存储用的就是CoreData) 沙盒 说到持久化存储就不得不说一下苹果的沙盒机制,苹果的

IOS之分析网易新闻存储数据(CoreData的使用,增删改查)

用过网易新闻客户端的朋友们都知道,获取新闻列表时有的时候他会请求网络有时候不会,查看某条新闻的时候再返回会标注已经查看的效果,接下来分析一下是如何实现的. 首先: 1.网易新闻用CoreData存储了新闻列表,因为我打开网易新闻的Documents时看到了三个文件: newsapp.sqlite,newsapp.sqlite-shm,newsapp.sqlite-wal:这三个文件是你在用CoreData时自动生成的.所以我确定他是用coredata存储的数据而不是sqlite数据库.(Core

iOS归档与解归档,持久化存储

点此下载iOS归档,持久化存储,解归档详细工程 //数据持久化的本质:将数据读取成文件保存在本地. 沙盒机制就是系统针对于每一个程序在本地生成的文件夹(名字随机生成), 对于不同的应用程序, 不能访问其他应用程序沙盒内的内容, 对于该应用程序内容起到保护作用:1 Documents:用来存储长久保存的数据 2 xxx.app:应用程序的包, 包含应用程序加载所需的所有资源(readonly只读, 不可修改), 平时使用的NSBundle就是该包 3 Library: 1) Caches:本地缓存

iOS数据库操作之coredata详细操作步骤

CHENYILONG Blog iOS数据库操作之coredata详细操作步骤 技术博客http://www.cnblogs.com/ChenYilong/ 新浪微博http://weibo.com/luohanchenyilong iOS应用数据存取的常用方式 ? XML属性列表 -- PList? NSKeyedArchiver 归档 ?Preference(偏好设置) ? SQLite3? Core DataCore Data简介 ? Core Data 是iOS SDK 里的一个很强大的