数据持久化

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

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

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

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

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

数据持久化_第1张图片
数据持久化_第2张图片

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,附上代码:

数据持久化_第3张图片
数据持久化_第4张图片

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

数据持久化_第5张图片

获取Document目录

数据持久化_第6张图片

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

数据持久化_第7张图片

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

1.什么场景需要用到coreData

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

2.下面是coreData的使用方法

数据持久化_第8张图片
数据持久化_第9张图片
数据持久化_第10张图片

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

数据持久化_第11张图片

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

数据持久化_第12张图片

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

数据持久化_第13张图片

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

数据持久化_第14张图片

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

数据持久化_第15张图片

(5)再选择目标数据库

数据持久化_第16张图片

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

数据持久化_第17张图片

(7)Mapping文件打开

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

数据持久化_第18张图片

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

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

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

2.添加实体【一张表】

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

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

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

数据持久化_第19张图片
数据持久化_第20张图片
数据持久化_第21张图片
数据持久化_第22张图片

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

五.MagicRecord

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

数据持久化_第23张图片

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

数据持久化_第24张图片

3.在ViewController里面

数据持久化_第25张图片
数据持久化_第26张图片

六.Sqlite

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

数据持久化_第27张图片

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

数据持久化_第28张图片

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

数据持久化_第29张图片
数据持久化_第30张图片
数据持久化_第31张图片

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

数据持久化_第32张图片

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

数据持久化_第33张图片

4.插入数据

数据持久化_第34张图片

5.查询数据

数据持久化_第35张图片

6.修改数据

数据持久化_第36张图片

7.删除数据

数据持久化_第37张图片

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。打开数据库方法如下:

数据持久化_第38张图片

(2)创建student表

数据持久化_第39张图片

(3)插入数据

数据持久化_第40张图片

(4)查询所有数据

数据持久化_第41张图片

(5)根据dbid 查询数据

数据持久化_第42张图片

(6)根据dbid 更新数据

数据持久化_第43张图片

(7)根据dbid删除数据

数据持久化_第44张图片

(8)删除所有数据

数据持久化_第45张图片

(9)删除student表

数据持久化_第46张图片

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

数据持久化_第47张图片
数据持久化_第48张图片

你可能感兴趣的:(数据持久化)