iOS中持久化方案有很多,例如:NSUserDefault、KeyChain、File,以及基于数据库的无数子方案。因此选择合适的方案很重要,要不然架构上面会很混乱
1、NSUserDefault
一般来说,小规模数据,弱业务相关数据,都可以放到NSUserDefault里面,内容比较多的数据,强业务相关的数据就不太适合NSUserDefault了。这种方式简单方便。
NSUserDefaults支持的数据类型有:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL. 如果想存储自定义对象,可以先把自定义对象转成NSData,然后再存储。存储路径是/Library/Preferences 下面
注意:1>切记不要存储可变数据,例如NSMutableArray,可以变成NSArray再存储;
2>NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:[userDefault synchronize]
2、keychain
Keychain是苹果提供的带有可逆加密的存储机制,普遍用在各种存密码的需求上。另外,由于App卸载只要系统不重装,Keychain中的数据依旧能够得到保留,以及可被iCloud同步的特性,大家都会在这里存储用户唯一标识串。所以有需要加密、需要存iCloud的敏感小数据,一般都会放在Keychain。
Keychain采用的加密算法是:AES(高级密码标准,美国国家安全局使用的,iOS内部使用的也是这个),理论破解时间1万年(哈哈哈、、)
3、文件存储
文件存储包括了Plist、archive、Stream等方式,一般结构化的数据或者需要方便查询的数据,都会以Plist的方式去持久化。Archive方式适合存储平时不太经常使用但很大量的数据,或者读取之后希望直接对象化的数据,因为Archive会将对象及其对象关系序列化,以至于读取数据的时候需要Decode很花时间,Decode的过程可以是解压,也可以是对象化,这个可以根据具体中的实现来决定。Stream就是一般的文件存储了,一般用来存存图片啊啥的,适用于比较经常使用,然而数据量又不算非常大的那种。
4、数据库存储
数据库存储的话,花样就比较多了。苹果自带了一个Core Data,当然业界也有无数替代方案可选,在iOS领域用得多的就是:Core Data,sqlite、FMDB(封装sqlite)比较多了,另外还有一个新起的移动端数据库realm,盗了几张图对比一下吧(嘿嘿)
看这几张图不难发现realm的性能确实不错,除了这个优点,还有简单易用,比CoreData和FMDB好用许多。这么好为什么不用呢,那是因为它也有很多缺点啊,举个栗子吧:据官方说会增加1MB左右的包大小(我感觉这个缺点挺严重的,为了增加点性能,其实这个性能只会在数据量很大的时候才会出现,移动端一般不会对大量数据进行增删改查,如果需要处理大量数据,一般会丢给服务器,又甩锅了。。)。当然有人会说,才1M,无所谓,现在用户流量那么多。
数据库方案主要是为了便于增删改查,当数据有状态和类别的时候最好还是采用数据库方案比较好,而且尤其是当这些状态和类别都是强业务相关的时候,就更加要采用数据库方案了。因为你不可能通过文件系统遍历文件去甄别你需要获取的属于某个状态或类别的数据,这么做成本就太大了。当然,特别大量的数据也不适合直接存储数据库,比如图片或者文章这样的数据,一般来说,都是数据库存一个文件名,然后这个文件名指向的是某个图片或者文章的文件。