iOS: 数据持久化方案

种类:

     plist存储:使用XML键值对持久化,它适用于少量且数据基本不怎么改变的情况。

        偏好存储:使用NSUserDefalut持久化,专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

        归档序列化存储:使用二进制序列化持久化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。

        沙盒存储:持久化在Document目录下,一般持久化一些文件,比如图片,音频,视频等,文件沙盒存储主要存储非机密数据。

        本地数据库存储:适合储存大规模数据,管理方便,不过操作稍微复杂一些。

三、详解:

1、plist存储

定义:

  plist文件,即属性列表文件,全名是Property List,这种文件的扩展名为.plist,因此,通常被叫做plist文件。

作用:

  它是一种用来存储串行化后的对象的文件,在iOS开发中通常用来存储用户设置,还可以用于存储程序中经常用到而不经常改动的数据。

问题:

(1)什么数据适合存储?

  能存储NSString、NSArray、NSDictionary、NSData、NSDate、NSNumber、Boolean不能存储自定义对象

(2)存到什么地方?

   写入创建的.plist文件中

(3)使用场景?

  plist常用于存储长时间不容易发生变化的数据,例如省市列表、车辆名称列表之类的数据等,这些数据可以保存在 plist 文件里,所以plist适用于存储小型数据,不推荐用plist做缓冲。        

(5)有什么缺点?

          因为所有的数据都放在root dictionary里,每次读取都要把整个root dictionary取出来再取需要的对象.如果plist文件缓存了几十M的数据.这样很费内存和时间。

2、偏好存储

定义:

  User Defaults 顾名思义就是一个用户为系统以及程序设置的默认值。

  每个用户都有自己的一套数据,用户和用户之间没法共享的。在苹果的API中,提供了一个类去存储用户的偏好设置。

  这个方法推荐只存储用户的偏好设置,不要存储一些字典、数组之类的。

作用:

  很多iOS应用都支持偏好设置,比如保存用户名、密码、字体大小等设置。

iOS提供了一套标准的解决方案来为应用加入偏好设置功能,就是每一个app都有一个plist文件专门用以保存偏好设置数据。

  每个应用都有个NSUserDefaults实例,通过它来存取偏好设置。

问题:

(1)什么数据适合存储?

  可以存储OC定义的所有数据类型,包括对象(系统和自定义的)类型、基本数据类型,如NSInteger等。

(2)存到什么地方?

  NSUserDefault 本地保存的位置是Library/Preferences 这个目录下的 plist 文件。

(3)使用场景?           

在App中,有时候我们需要将一些信息进行短期的保存,方便用户下次更方便使用App,减少多余的操作,增强用户体验。

比如,保存用户名、字体大小、是否自动登录等。

(5)注意事项?

偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要在偏好设置中保存其他数据。

如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的,偏好设置会将所有的数据都保存到同一个文件中。

使用偏好设置对数据进行保存之后, 它保存到系统的时间是不确定的,会在将来某一时间点自动将数据保存到Preferences文件夹下面,如果需要即刻将数据存储,可以使用[defaults synchronize];

所有的信息都写在一个文件中,对比简单的plist可以保存和读取基本的数据类型。

不支持自定义对象的存储.

使用注意点:

NSUserDefaults存储的数据都是不可变的,想将可变数据存入需要先转为不可变才可以存储.

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

3、归档序列化存储

定义:

         对象归档是iOS中数据持久化的一种方式。 归档是指另一种形式的二进制序列化,但它是任何对象都可以实现的更常规的类型。

作用:

         使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们

3、归档序列化存储 NSKeyedArchiver

定义:

         对象归档是iOS中数据持久化的一种方式。 归档是指另一种形式的二进制序列化,但它是任何对象都可以实现的更常规的类型。

作用:

         使用对模型对象进行归档的技术可以轻松将复杂的对象写入文件,然后再从中读取它们。

问题:

(1)什么数据适合存储?

    要使用对象归档,则归档的对象所属类中实现的每个属性都是标量,或者都是遵循NSCoding协议和NSCopying协议的某个类的实例对象。

(2)存到什么地方?

    对象归档后将得到一个后缀为.archive的文件,数据就保存在了这个文件中。

(3)使用场景?

    定义某个实例,如果需要持久化该实例从而方便以后使用它的属性值,同时可以随意更改该实例的属性值,推荐在给实例初始化的同时直接使用归档进行存储。      

(5)有什么缺点?

          当待存储的实例具有成百上千个属性的时候,单纯的一个个去序列化属性值耗时又费力。(当然可以借助runtime机制解决这个缺点,MJExtension这个框架就是这个原理) 

4、Document沙盒存储

定义:     

          每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。

          应用必须待在自己的沙盒里,其他应用不能访问该沙盒。

          沙盒的本质就是一个文件夹,名字是随机分配的。

目录:

Application:存放程序源文件,上架前经过数字签名,上架后不可修改。

Documents: 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。

tmp: 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。

Library/Caches: 保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份 该目录。⼀一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下

Library/Preference: 保存应用的所有偏好设置,如iOS的Settings(设置) 应⽤会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录。

// 获取程序的Home目录 NSString *path = NSHomeDirectory(); 

 // 获取Document目录 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) fristObject];

    // 获取Cache目录      NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) fristObject];   

    // 获取Library目录      NSString *path = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) fristObject]; 

// 获取Tmp目录      NSString *path = NSTemporaryDirectory();

作用:

        用来存储和备份稍微较大的不是很重要的数据,比如缓存图片、音频、视频等,最典型的SDWebImage缓存图片的框架。

        当然缓存的时间长短根据开发者选择持久化的目录路径有关。

问题:

(1)什么数据适合存储?

    图片、音频、视频、文本等

(2)存到什么地方?

    写入创建的.txt、.data等任意扩展名的文件中

(3)使用场景?

    当App中涉及到电子书阅读、听音乐、看视频、刷图片列表等时,推荐使用沙盒存储。

    因为这可以极大的节约用户流量,而且也增强了app的体验效果。

主要步骤

根据这个思路,分析了一下数据库升级了主要步骤大概如下:

获取数据库中旧的表

修改表名,添加后缀“_bak”,把旧的表当做备份表

创建新的表

获取新创建的表

遍历旧的表和新表,对比取出需要迁移的表的字段

数据迁移处理

删除备份表

 FMDBMigrationManager

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