iOS 本地数据持久化

面试中一定会问到的问题, iOS数据持久化有哪些? 以及其优缺点?

本文内容
  • iOS 本地数据持久化的几种类型;
  • 应用场景

1. iOS 本地数据持久化的类型

  • 1.1 NSUserDefaults
  • 1.2 plist
  • 1.3 Keychain(钥匙串)
  • 1.4 归档 (解档)
  • 1.5 沙盒
  • 1.6 数据库
  • 1.7 CoreData

2. 各种类型的应用场景

2.1 NSUserDefaults

用于存储用户的偏好设置和用户信息,如用户名,是否自动登录,字体大小等.数据自动保存在沙盒的Libarary/Preferences目录下.

它能存储的数据类型为:NSNumber(NSInteger、float、double),NSString,NSDate,NSArray,NSDictionary,BOOL.

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

优点: 使用简单方便 缺点: NSUserDefaults将输入的数据储存在.plist格式的文件下,这种存储方式就决定了它的安全性几乎为0,所以==不建议存储一些敏感信息如:用户密码,token,加密私钥等!==

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

2.2 plist

即属性列表文件,全名是Property List,这种文件的扩展名为.plist,因此,通常被叫做plist文件。它是一种用来存储串行化后的对象的文件,用于存储程序中经常用到且数据量小而不经常改动的数据。

可以存储的类型:NSNumber,NSString,NSDate,NSData ,NSArray,NSDictionary,BOOL. 不支持自定义对象的存储.

优缺点:

  • 易用性强
  • 用于存储少量数据, 不适合操作处理大量数据
  • 无法将自定义对象序列化到属性中; 如果需要存储自定义类型的数据需要先进行序列化!
2.3 keychain

用于本地重要数据的存储,将数据加密后存储在本地更安全.如:密码,秘钥,序列号等.

当你删除APP后Keychain存储的数据不会删除,所以在重装App后,Keychain里的数据还能使用。从ios 3.0开始,跨程序分享keychain变得可行而NSUserDefaults存储的数据会随着APP而删掉.

使用keychain时苹果官方已经为我们封装好了文件KeychainItemWrapper,引入即可使用.当然也可是使用其他优秀的第三方的封装,比如ssKeychain. 使用方法查看官方文档或自行百度

2.4 归档(NSKeyedArchiver)

归档是iOS开发中数据存储常用的技巧,==归档可以直接将对象储存成文件,把文件读取成对象。==

一般用于存储少量数据

相对于plist或者userdefault形式,归档可以存储的数据类型更加多样,并且可以存取自定义对象。对象归档的文件是保密的,在磁盘上无法查看文件中的内容,更加安全。

遵守NSCoding协议,并实现该协议中的两个方法。如果是继承,则子类一定要重写那两个方法。因为子类在存取的时候,会去子类中去找调用的方法,没找到那么它就去父类中找,所以最后保存和读取的时候新增加的属性会被忽略。需要先调用父类的方法,先初始化父类的,再初始化子类的。

保存数据的文件的后缀名可以随意命名

最大的优点是:可以将复杂的对象写入文件 可以归档集合类,所以无论添加多少对象,将对象写入磁盘的方式都是一样的,不会增加工作量;

2.5.沙盒

持久化在Document目录下,一般存储非机密数据。当App中涉及到电子书阅读、听音乐、看视频、刷图片列表等时,推荐使用沙盒存储。因为这可以极大的节约用户流量,而且也增强了app的体验效果.

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

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

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

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

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

2.6 数据库

适合储存数据量较大的数据,一般使用FMDB和CoreData来实现.

FMDB是iOS平台的SQLite数据库框架,FMDB以OC的方式封装了SQLite的C语言API,使用起来更加面向对象,省去了很多麻烦、冗余的C语言代码,对比苹果自带的Core Data框架,更加轻量级和灵活,提供了多线程安全的数据库操作方法,有效地防止数据混乱。

易用性不强, 但可以存储大量数据,存储、检索大量数据非常高效;能对数据进行复杂的聚合,比使用对象执行这些操作要高效得多。

2.6 CoreData

CoreData:

Core Data是iOS5之后才出现的一个框架,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。在此数据操作期间,我们不需要编写任何SQL语句.

CoreData 本质还是讲数据存在了SQLite数据库文件 ,使用不是很方便.

MagicRecord是对CoreData的二次封装,使用起来简单操作方便.

FMDB和MagicRecord的性能方面各有千秋,需要根据项目的实际需求进行选择.没有最好的方案只有最适合的方案!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值