一.数据持久化是什么?用来干什么?
数据持久化是一种非易失性存储技术,再重启计算机或者设备的后也不会丢失数据,是将内存中的数据模型转换成存储模型,以及将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以使关系模型,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)升级表,数据库迁移