iOS数据持久化方案

10次阅读

共计 2525 个字符,预计需要花费 7 分钟才能阅读完成。

技术由来
数据持久化是 iOS 开发中必不可少的一项技能。因为开发中我们多会涉及到用户信息存储、文件存储、应用内容缓存中的一个或者几个场景。
数据持久化的几种方式

NSUserDefaults
plist
keychain(钥匙串)
归档
沙盒
数据库

数据持久化几种方式的一览图:

1.NSUserDefaults
NSUserDefaults 用于存储用户的偏好设置和用户信息, 如用户名, 是否自动登录, 字体大小等. 数据自动保存在沙盒的 Libarary/Preferences 目录下.NSUserDefaults 将输入的数据储存在.plist 格式的文件下, 这种存储方式就决定了它的安全性几乎为 0, 所以不建议存储一些敏感信息如: 用户密码,token, 加密私钥等! 它能存储的数据类型为:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL. 不支持自定义对象的存储.
使用注意点:

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

2.plist
即属性列表文件,全名是 Property List,这种文件的扩展名为.plist,因此,通常被叫做 plist 文件。它是一种用来存储串行化后的对象的文件,用于存储程序中经常用到且数据量小而不经常改动的数据。可以存储的类型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL. 不支持自定义对象的存储.
使用注意点:如果需要存储自定义类型的数据需要先进行序列化!
3.Keychain(钥匙串)
用于本地重要数据的存储, 将数据加密后存储在本地更安全. 如: 密码, 秘钥, 序列号等. 当你删除 APP 后 Keychain 存储的数据不会删除,所以在重装 App 后,Keychain 里的数据还能使用。从 ios 3.0 开始,跨程序分享 keychain 变得可行而 NSUserDefaults 存储的数据会随着 APP 而删掉. 使用 keychain 时苹果官方已经为我们封装好了文件 KeychainItemWrapper, 引入即可使用. 当然也可是使用其他优秀的第三方的封装, 比如 ssKeychain。keychain 的使用方法
4. 归档(NSKeyedArchiver)
归档是 iOS 开发中数据存储常用的技巧,归档可以直接将对象储存成文件,把文件读取成对象。相对于 plist 或者 userdefault 形式,归档可以存储的数据类型更加多样,并且可以存取自定义对象。对象归档的文件是保密的,在磁盘上无法查看文件中的内容,更加安全。遵守 NSCoding 协议,并实现该协议中的两个方法。如果是继承,则子类一定要重写那两个方法。因为子类在存取的时候,会去子类中去找调用的方法,没找到那么它就去父类中找,所以最后保存和读取的时候新增加的属性会被忽略。需要先调用父类的方法,先初始化父类的,再初始化子类的。保存数据的文件的后缀名可以随意命名。

存储类型
安全性
文件名后缀
数据量大小
应用场景

NSUserDefaults
不安全
plist

用户偏好设置,用户名

plist
不安全
plist

不经常改动

keychain
安全


密码、秘钥、序列号

归档
安全
任意

缓存

5. 沙盒

持久化在 Document 目录下,一般存储非机密数据。当 App 中涉及到电子书阅读、听音乐、看视频、刷图片列表等时,推荐使用沙盒存储。因为这可以极大的节约用户流量,而且也增强了 app 的体验效果.Application:存放程序源文件,上架前经过数字签名,上架后不可修改。
Documents: 保存应运行时生成的需要持久化的数据,iTunes 同步设备时会备份该目录。例如, 游戏应用可将游戏存档保存在该目录。
tmp: 保存应运行时所需的临时数据, 使⽤完毕后再将相应的文件从该目录删除。应用没有运行时, 系统也可能会清除该目录下的文件。iTunes 同步设备时不会备份该目录。
Library/Caches: 保存应用运行时生成的需要持久化的数据,iTunes 同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到 Caches 下。
Library/Preference: 保存应用的所有偏好设置,如 iOS 的 Settings(设置) 应会在该目录中查找应⽤的设置信息。iTunes 同步设备时会备份该目录。

6. 数据库
存储数据量较大的数据,一般使用数据库来存储。如:FMDB、CoreData、Realm、WCDB。
6.1 FMDB
FMDB 是 iOS 平台的 SQLite 数据库框架,FMDB 以 OC 的方式封装了 SQLite 的 C 语言 API,使用起来更加面向对象,省去了很多麻烦、冗余的 C 语言代码,对比苹果自带的 Core Data 框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法,有效地防止数据混乱.
6.2 CoreData
Core Data 是 iOS5 之后才出现的一个框架,它提供了对象 - 关系映射 (ORM) 的功能,即能够将 OC 对象转化成数据,保存在 SQLite 数据库文件中,也能够将保存在数据库中的数据还原成 OC 对象。在此数据操作期间,我们不需要编写任何 SQL 语句. 但是直接操作 CoreData 显的不是那么容易, 所以我多数的时候会使用 MagicRecord 来实现.MagicRecord 是对 CoreData 的二次封装, 使用起来简单操作方便.
6.3 Realm
Realm 的使用 Realm 的 GitHub 传送门
6.4 WCDB
WCDB 是微信移动端开源的数据库组件。WCDB 的使用介绍 WCDB 的详细介绍 WCDB 的 GitHub 传送门
写在最后
本文主要是对 iOS 开发过程中使用到的数据持久化方案的一个归纳整理,有些其实我自己也没有具体使用过,但是附上了相应的链接,有需要的同学可以具体的去学习。
参考:http://www.cocoachina.com/ios…

正文完
 0