美文网首页
数据持久化

数据持久化

作者: bliva | 来源:发表于2017-10-12 14:56 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:数据持久化

          本文链接:https://www.haomeiwen.com/subject/ogbhpttx.html