数据持久化

一.数据持久化是什么?用来干什么?

数据持久化是一种非易失性存储技术,再重启计算机或者设备的后也不会丢失数据,是将内存中的数据模型转换成存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以使关系模型,XML,二进制流等。持久化技术主要用于MVC模型中的model层。现在的数据持久化有下面几种技术:

二.NSUserDefaults(关键词:属性列表、xml序列化)

1.NSUserDefaults是苹果基于属性列表(plist文件)所封装的一个单例类,该类提供了基本数据类型的plist文件存储方法。

以下是我们项目中搜索所用到的NSUserDefaults的用法

2.简单总结一下NSUserDefaults常用方法(伪代码)

/// 从NSUserDefaults中取出key值所对应的Value,id可以是NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL等基本数据类型

id=[[NSUserDefaults standardUserDefaults] objectForKey:(NSString *)];

/// 将数据对象存储到NSUserDefaults中

[[NSUserDefaults standardUserDefaults] setObject:idforKey:(NSString *)];

/// 将数据对象从NSUserDefaults中移除

[[NSUserDefaults standardUserDefaults] removeObjectForKey:(NSString *)];

/// 同步更新到Plist文件,当修改NSUserDefaults的数据后,必须进行此步操作同步数据

[[NSUserDefaults standardUserDefaults] synchronize];

3.NSUserDefaults特点

(1)NSUserDefaults常用于存储OC的基本数据类型,不适合存储自定义对象

NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL

(2)自定义对象可以转化成基本类型NSData后在使用NSUserDefaults进行存储,但并不常用

(3)当plist文件存储的数据发生改变(写操作)时,需要调用synchronize方法同步,否则数据无法同步保存

(4)Key值应具有唯一性,重名时覆盖先前的key值

(5)实际开发中,NSUserDefaults常用语存储配置信息,优点是简便,缺点是所有数据都是以明文存储在plist文件中,容易被解读安全性不高

4.NSUserDefaults存储的对象全是不可变的

假如,我想存储一个NSMutableArray的对象,我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去

取出数据也是一样的,想要用NSUserDefaults中的数据给可变数组赋值,先给出一个错误的写法

正确的写法

三.对象归档(关键词:序列化)

1.什么是对象归档

和属性列表一样,对象归档也是将对象写入文件存入硬盘内,本质上也是另外一种序列化(存储模型不同)。归档与属性列表方式不同,属性列表只有指定的一些对象才能进行持久化且明文存储,而归档时任何实现了NSCoding协议的对象都可以被持久化,且归档后的文件是加密的。对象归档涉及两个类:NSKeyedArchiver和NSKeyedUnarchiver,这两个类是NSCoder的子类,分别用于归档以及解档。例如,现在项目中存储的用户信息实体使用的是归档的方法,以下是自己写的一个小demo,附上代码:

这个Person类就具有了归档与解档能力,当你需要对一个Person类的实力对象进行储存或者解析时,在你自己的方法中只要键入如下代码即可,下面两个方法对应两个按钮的回调,点击按钮时分别执行person对象的归档和解档

获取Document目录

避免文件和数据被同步到iCloud和iTunes

四.CoreData(关键词:集成化)

1.什么场景需要用到coreData

当你的应用程序需要在本地存储大量的关系数据模型时,显然上诉方法都不适用,因为不论对象归档还是数据列表,一旦数据模型之间存在依赖关系,问题就将变得复杂。而此时iPhone自带的轻量级数据库Sqlite便成为我们的首选,如果你熟悉数据库,那么coreData也将不在神秘,你可以理解为它是Sqlite封装的一个框架,你可以在Xcode中进行Sqlite数据库的可视化操作。

2.下面是coreData的使用方法

3.现在用代码实现数据的增删查找,下面是几个核心类

4.为什么要使用coreData

(1)coreData脱离了sql语句,集成化更高。

(2)coreData对版本迁移支持比较好,App升级后数据库字段或者表有更改会导致crash,CoreData的版本管理和数据迁移变得非常有用,手动写sql语句操作相对麻烦一些。

(3)coreData不光能操纵SQLite,coreData和iCloud的结合也很好,如果有这方面需求的话优先考虑coreData

(4)coreData是支持多线程的,但需要thread confinement的方式实现,使用了多线程之后可以最大化的防止阻塞主线程

5.coreData数据迁移

(1)点中coreData里面随便一个数据库然后Editor->Add Model Version然后Finish

(2)然后把最右边的Model Version Current改为新建的Model

(3)在xcdatamodeld相同的文件夹目录下,“New File” ->"Core Data"->"Mapping Model"

(4)选择需要Mapping的源数据库

(5)再选择目标数据库

(6)接着命名一下Mapping Model文件的名字(名字最好能一眼看上去就能区分出是哪个数据库的版本升级上来的,这里我写的就是ModelV2ToV3,这样一看就知道是V2到V3的升级)

(7)Mapping文件打开

Mapping文件打开对应的就是Source源实体属性,迁移到Target目标实体属性的映射,上面是属性,下面是关系的映射。$source就是代表的源实体

举个例子吧,假设我最初有一张很抽象的表,叫Object表,用来存储东西的一些属性,里面假设有name,width,height。突然我有一天有新需求了,需要在Object表里面新增几个字段,比如说colour,weight等,由于这个都是简单的新增,不涉及到数据的转移,这时候用轻量级迁移就可以了。

6.手动创建CoreData,创建步骤如下

1.创建模型文件【相当于一个数据库】

2.添加实体【一张表】

3.创建实体类【相当模型--表结构】

4.生成上下文 关联模型文件生成数据库

7.创建上下文和关联数据库之间我们先来看看相对应的关系依赖图

从上面可以看出,我们使用coreData会有很多的配置代码;下面我们可以在以下关于coreData的第三方库MagicRecord

五.MagicRecord

1.MagicRecord是对CoreData的深度封装,我们用pod导入MagicRecord后,导入MagicRecord后,我们不需要在写上面CoreData步骤7的代码,只需要在APPDelegate文件里面写上下面这行代码

2.按照CoreData创建数据库和表的顺序创建好我们需要的实体

3.在ViewController里面

六.Sqlite

1、新建项目sqliteDemo,添加使用sqlite的库libsqlite3.0.tbd

2.在ViewController里面的ViewDidLoad里面获取documents目录,将数据库文件放在沙盒目录下的Documents下

注:写完上面代码后,我们可以打印出paths的路径,然后在Finder里面点击(command+shift+g)查看我们建好的数据库文件

这个文件可以用火狐的Sqlite manager插件打开(这个链接讲解了SQLite Manager的使用方法http://www.hangge.com/blog/cache/detail_766.html)(这张图是我创建好数据库后插入数据后的表)

3.创建 表格,创建了一张名为PERSIONINFO的数据库表,其中有一个自增的ID,和NAME,AGE,SEX,WEIGTH,ADDRESS五个属性

4.插入数据

5.查询数据

6.修改数据

7.删除数据

8.总结:实际开发涉及的sql语句会比这个麻烦(这是最简单的sqlite创建和使用),而且SQLite3的使用是比较麻烦的,因为都是些C语言的函数,理解起来困难。不过一般开发过程中,使用的都是第三方开源库FMDB,封装了这些基本的C语言方法,使得我们在使用时更加容易理解,提交开发效率。

七.FMDB

1.FMDB是iOS平台的SQLite数据库框架,它是以OC的方式封装了SQLite的C语言API,它相对于cocoa自带的C语言框架有如下的有点:

(1)使用起来更加面向对象,省去了很多麻烦,冗余的C语言代码

(2)对比苹果自带的Core Data框架,更加轻量级和灵活

(3)提供了多线程安全的数据库操作方法,有效地防止数据混乱

2.核心类

FMDB有三个主要的类

(1)FMDatabase

一个FMDatabase对象就代表一个单独的SQLite数据库,用来执行SQL语句

(2)FMResultSet

使用FMDatabase执行查询后的结果集

(3)FMDatabaseQueue

用于在多线程中只想多个查询或更新,它是线程安全的

3.打开数据库

(1)和c语言框架一样,FMDB通过指定SQLite数据库文件路径来创建FMDatabase对象,但FMDB更加容易理解,使用起来更加容易,使用之前一样需要导入sqlite3.dylib。打开数据库方法如下:

(2)创建student表

(3)插入数据

(4)查询所有数据

(5)根据dbid 查询数据

(6)根据dbid 更新数据

(7)根据dbid删除数据

(8)删除所有数据

(9)删除student表

(10)升级表,数据库迁移

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容