数据持久化是iOS开发中必不可少的一项技能。由于开发中咱们多会涉及到用户信息存储、文件存储、应用内容缓存中的一个或者几个场景。html
数据持久化几种方式的一览图:ios
NSUserDefaults用于存储用户的偏好设置和用户信息,如用户名,是否自动登陆,字体大小等.
数据自动保存在沙盒的Libarary/Preferences目录下.
NSUserDefaults将输入的数据储存在.plist格式的文件下,这种存储方式就决定了它的安全性几乎为0,因此不建议存储一些敏感信息如:用户密码,token,加密私钥等!
它能存储的数据类型为:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.
不支持自定义对象的存储.git
使用注意点:github
即属性列表文件,全名是Property List,这种文件的扩展名为.plist,所以,一般被叫作plist文件。它是一种用来存储串行化后的对象的文件,用于存储程序中常常用到且数据量小而不常常改动的数据。
能够存储的类型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL.
不支持自定义对象的存储.数据库
使用注意点:
若是须要存储自定义类型的数据须要先进行序列化!缓存
用于本地重要数据的存储,将数据加密后存储在本地更安全.如:密码,秘钥,序列号等.当你删除APP后Keychain存储的数据不会删除,因此在重装App后,Keychain里的数据还能使用。从ios 3.0开始,跨程序分享keychain变得可行而NSUserDefaults存储的数据会随着APP而删掉.
使用keychain时苹果官方已经为咱们封装好了文件KeychainItemWrapper,引入便可使用.固然也但是使用其余优秀的第三方的封装,好比ssKeychain。
keychain的使用方法安全
归档是iOS开发中数据存储经常使用的技巧,归档能够直接将对象储存成文件,把文件读取成对象。
相对于plist或者userdefault形式,归档能够存储的数据类型更加多样,而且能够存取自定义对象。对象归档的文件是保密的,在磁盘上没法查看文件中的内容,更加安全。
遵照NSCoding协议,并实现该协议中的两个方法。若是是继承,则子类必定要重写那两个方法。由于子类在存取的时候,会去子类中去找调用的方法,没找到那么它就去父类中找,因此最后保存和读取的时候新增长的属性会被忽略。须要先调用父类的方法,先初始化父类的,再初始化子类的。
保存数据的文件的后缀名能够随意命名。微信
存储类型 | 安全性 | 文件名后缀 | 数据量大小 | 应用场景 |
---|---|---|---|---|
NSUserDefaults | 不安全 | plist | 小 | 用户偏好设置,用户名 |
plist | 不安全 | plist | 小 | 不常常改动 |
keychain | 安全 | 小 | 密码、秘钥、序列号 | |
归档 | 安全 | 任意 | 大 | 缓存 |
持久化在Document目录下,通常存储非机密数据。当App中涉及到电子书阅读、听音乐、看视频、刷图片列表等时,推荐使用沙盒存储。由于这能够极大的节约用户流量,并且也加强了app的体验效果.Application:存放程序源文件,上架前通过数字签名,上架后不可修改。网络
Documents: 保存应运行时生成的须要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。多线程
tmp: 保存应运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
Library/Caches: 保存应用运行时生成的须要持久化的数据,iTunes同步设备时不会备份该目录。通常存储体积大、不须要备份的非重要数据,好比网络数据缓存存储到Caches下。
Library/Preference: 保存应用的全部偏好设置,如iOS的Settings(设置) 应会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录。
存储数据量较大的数据,通常使用数据库来存储。如:FMDB、CoreData、Realm、WCDB。
FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API,使用起来更加 面向对象,省去了不少麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了 多线程安全的数据库操做方法,有效地防止数据混乱.
Core Data是iOS5以后才出现的一个框架,它提供了 对象-关系映射(ORM)的功能,即可以将OC对象转化成数据,保存在SQLite数据库文件中,也可以将保存在数据库中的数据还原成OC对象。在此数据操做期间,咱们不须要编写任何SQL语句.可是直接操做CoreData显的不是那么容易,因此我多数的时候会使用 MagicRecord来实现.MagicRecord是对CoreData的二次封装,使用起来简单操做方便.
WCDB是微信移动端开源的数据库组件。
WCDB的使用介绍
WCDB的详细介绍
WCDB 的GitHub传送门
本文主要是对iOS开发过程当中使用到的数据持久化方案的一个概括整理,有些其实我本身也没有具体使用过,可是附上了相应的连接,有须要的同窗能够具体的去学习。