数据持久化

type
status
date
slug
summary
category
icon

前言

iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据。
在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹。
我在开发中所使用的数据持久化的三种方式:
  • 归档,解档
  • NSUserDefault
  • SQLite-FMDB

iOS应用的沙盒结构

前言:
处于安全考虑,iOS系统的沙盒机制规定每个应用都只能访问当前沙盒目录下面的文件(也有例外,比如在用户授权情况下访问通讯录,相册等).
由于iOS中应用的数据存储是沙盒机制,因此读取和写入文件,我们需要调用C函数 “ NSSearchPathForDirectoriesInDomains()” 来查找各种目录.

主要路径

这里我介绍iOS应用沙盒下比较重要的几个路径:
  1. Documents 作用:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据。该路径可通过配置实现iTunes共享文件。可被iTunes备份。
  1. Library
    1. Preferences 目录:包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好。
    2. Caches 目录:用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
  1. tmp 作用:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。该路径下的文件不会被iTunes备份。

获取各个路径

归档,解档

归档(archiving)也是指另一种形式的序列化。但强大的一点是,它是任何对象都可以实现的更常规的储存数据类型;
如果要将各种类型的对象存储到文件中,而不仅仅是字符串、数组、字典类型,利用NSKeyedArchiver类创建带健(keyed)的档案来完成将非常灵活.
在带健的档案中,会为每个归档对象提供一个名称,即健(key)。根据这个key可以从归档中检索该对象。这样,就可以按照任意顺序将对象写入归档并进行检索。另外,如果向类中添加了新的实例变量或删除了实例变量,程序也可以进行处理.
待归档的自定义对象需要遵循NSCoding协议。

使用

注意:
iOS13前后的归档解档使用不同的API.
iOS13之前
归档解档的代码
iOS13之后
归档解档的代码

NSUserDefault

NSUserDefaults用来存储 用户设置 系统配置等一些小的数据。
因为数据是明文存储在 plist 文件中,不安全,即使只是修改一个 key 都会 load 整个文件,数据多加载慢(IO 内存),不适合存储大量数据。
它是单例的,也是线程安全的,是以键值对 key-value 的形式保存在沙盒中
存储路径为:沙盒路径的Library——>Preferences文件夹中,相当于全局的变量.
支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型,如果要存放其他数据类型或者自定义的对象(如自定义的类对象),则必须将其转换成NSData存储。即使对象是NSArray或NSDictionary,他们存储的类型也应该是以上范围包括的。
在进行自定义对象的归档时需要实现NSCoding协议,不实现协议方法则抛出异常,类似于序列化与反序列话,获得的对象都是不一致的。
NSUserDefaults返回的值是不可改变的,即使存储的时候是可变的值。 对相同的Key赋值约等于一次覆盖。

得到偏好设置的单例对象

储存数据的几个方法

得到数据的几个方法

移除数据

立即写入-synchronize

NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

SQLite-FMDB

什么是FMDB

iOS中使用C语言函数对原生SQLite数据库进行增删改查操作,复杂麻烦,于是,就出现了一系列将SQLite API封装的库,如FMDB。 FMDB是针对libsqlite3框架进行封装的三方框架,它以OC的方式封装了SQLite的C语言的API,使用步骤与SQLite相似。
FMDB的优点是:
  1. 使用时面向对象,避免了复杂的C语言代码
  1. 对比苹果自带的Core Data框架,更加轻量级和灵活
  1. 提供多线程安全处理数据库操作方法,保证多线程安全跟数据准确性

主要类型

FMDatabase:一个FMDatabase对象代表一个单独的SQLite数据库,通过SQLite语句执行数据库的增删改查操作 FMResultSet:使用FMDatabase对象查询数据库后的结果集 FMDatabaseQueue:用于多线程操作数据库,它保证线程安全
FMDB使用方式:
  1. GitHub中下载FMDB,将文件导入工程中
  1. 导入libsqlite3.0框架,导入头文件FMDatabase.h
  1. 创建数据库路径,创建数据库,操作前开启数据库,构建操作SQLite语句,数据库执行增删改查操作,操作完关闭数据库

接下来介绍FMDB的基本操作:

Insert

Delete

Update

Select

接下来看看具体使用

首先创建一个类 Student
然后在ViewController中添加两个属性:
接下来执行FMDB操作
增删改查:

FMDB的事务

  1. 事务定义: 事务(Transaction)是并发操作的基本单位,是指单个逻辑工作单位执行的一系列操作序列,这些操作要不都成功,要不就不成功,事务是数据库维护数据一致性的单位,在每个事务结束时,都能保证数据一致性与准确性,通常事务跟程序是两个不同的概念,一个程序中包含多个事务,事务主要解决并发条件下操作数据库,保证数据
  1. 事务特征:
    1. 原子性(Atomic):事务中包含的一系列操作被看作一个逻辑单元,这个逻辑单元要不全部成功,要不全部失败 一致性(Consistency):事务中包含的一系列操作,只有合法的数据被写入数据库,一些列操作失败之后,事务会滚到最初创建事务的状态 隔离性(Isolation):对数据进行修改的多个事务之间是隔离的,每个事务是独立的,不应该以任何方式来影响其他事务 持久性(Durability)事务完成之后,事务处理的结果必须得到固化,它对于系统的影响是永久的,该修改即使出现系统固执也将一直保留,真实的修改了数据库
  • 如何在项目中使用事务操作SQLite
CPU渲染和GPU渲染单链表
iOS
数据结构与算法
视频渲染开发