ios 本地数据库存储的方式和几种方案的比较

常见的储存方式


 - plist 格式文件存储
 - NSUserDefaults 沙盒存储(个人偏好设置)
 - 文件读写存储
 - 解归档存储
 - 数据库存储
 - Keychain存储

了解缓存,先要了解iOS中沙盒机制这个概念

沙盒其实质就是在iOS系统下,每个应用在内存中对应的存储空间。
每个iOS应用都有自己的应用沙盒(文件系统目录),与其他文件系统隔离,各个沙盒之间相互独立,而且不能相互访问(手机没有越狱情况下),各个应用程序的沙盒相互独立的,在系统内存消耗过高时,系统会收到内存警告并自动退出软件。这就保证了系统的数据的安全性及系统的稳定性。

IOS应用程序职能在系统为该应用所分配的文件区域下读写文件,这个文件区域就是应用程序沙盒。所有的非代码文件如:图片、声音、映象等等都存放在此。

在mac中command+shift+G命令,然后输入users/用户名/library命令进入库,然后依次进入application support/iphone simulator/版本/applications文件夹,这里面的各个文件夹对应着各个应用程序。

Documents:除了基于NSUserDefaults的首选项设置外,应用程序的数据、文件都保存在该目录下
Library:基于NSUserDefaults的首选项参数保存在Library/Preferences下
tmp:应用程序存储临时文件,ios同步时itunes不会同步这里面的数据,当应用程序不在需要这些文件时,应当删除以避免占用空间。

plist 格式文件存储

  • plist文件 即为属性列表文件
  • 可以存储的类型有NSString,NSDictionary,NSArray,NSNumber,Boolean,NSDate,NSData等基本类型
  • 常用于存储用户的设置,或存储项目中经常用到又不经常改变的数据
  • 创建.plist可以用xcode工具,也可以用代码
  • 不适合存储大量数据,而且只能存储基本类型
  • 可以实现:增,删,改,查等操作,但数据的存取是一次性的全部操作,所以性能方向表现并不好
  • NSDate,BOOL,Int,Float,NSNumber,NSData的数据存储都是转换成NSDictionary的Key-Value形式之后,通过NSDictionary存储方式存储的。

NSUserDefaults 沙盒存储(个人偏好设置)

  • NSUserDefaults 沙盒存储(个人偏好存储) 是个单例类,用于存储少量数据,例如登录后的用户名,密码等。
  • 应用程序启动后,会在沙盒路径Library -> Preferences 下默认生成以工程bundle为名的.plist文件,用NSUserDefaults存储的数据都是存储在该.plist文件中。
  • 这种方式本质是操作plist文件,所以性能方面的考虑同plist文件数据储存

文件读写存储(NSFileManager)

  • 文件操作可通过单例 NSFileManager 处理。文件存储的路径可以代码设置。

  • 可以存储大量数据,对数据格式没有限制。

  • 但由于数据的存取必须是一次性全部操作,所以在频繁操作数据方面性能欠缺。

    解归档存储

  • plist 与 NSUserDefaults(个人偏好设置两种类型的储存只适用于系统自带的一些常用类型,而且前者必须拿到文件路径,后者也只能储存应用的主要信息。

  • 对于开发中自定义的数据模型的储存,我们可以考虑使用归档储存方案。 归档保存数据,文件格式自己可以任意,没有要求

  • 即便设置为常用的数据格式(如:.c .txt .plist 等)要么不能打开,要么打开之后乱码显示。

  • 值得注意的是使用归档保存的自定义模型需要实现NSCoding协议下的两个方法。 不适合存储大量数据,可以存储自定义的数据模型

  • 不适合存储大量数据,可以存储自定义的数据模型。

  • 虽然归档可以存储自定义的数据结构,但在大批量处理数据时,性能上仍有所欠缺。
    

数据库存储

FMDB的详细使用

  • 它是一款轻型的嵌入式数据库,安卓和ios开发使用的都是SQLite数据库;占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了;而且它的处理速度比Mysql、PostgreSQL这两款著名的数据库都还快。
  • FMDB 正是基于 SQLite 开发的一套开源库。使用时,需要自己写一些简单的SQLite语句
  • CoreData 是苹果给出的一套基于 SQLite 的数据存储方案;而且不需要自己写任何SQLite语句。该功能依赖于 CoreData.framework 框架,该框架已经很好地将数据库表和字段封装成了对象和属性,表之间的一对多、多对多关系则封装成了对象之间的包含关系
  • Core Data的强大之处就在于这种关系可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表的时候,其关联的其他表也会随着更新。Core Data的另外一个特点就是提供了更简单的性能管理机制,仅提供几个类就可以管理整个数据库。由于直接使用苹果提供的CoreData容易出错,这里提供一个很好的三方库 MagicalRecord

缓存系统

对大多数 APP 而言,都是 Hybrid 开发,Web 页与原生同时存在,其中 Web 页可能是 UIWeb 也可能是 WKWeb 。所以与之相应的缓存系统,应该包括 Web 缓存与 原生接口数据缓存两部分。

原生接口部分的数据缓存

存储方式:主要采用文件读写、归档、个人偏好设置(NSUserDefaults) 。

具体说明:大部分接口数据解析之后写入文件保存(读写操作最好 GCD 子线程操作);整个应用需要用到的重要数据模型可以考虑采用归档方式(标记状态的数据模型);与用户相关的信息、单个标记标识等采用个人偏好设置。

补充: 原生接口数据存储方式以上三种方式就已够用;当然对于一些涉及查询、删除、更新等操作的数据模型,就需要使用数据库操作。这里推荐使用 CoreData 的封装库 MagicalRecord 。

Keychain存储

iOS keychain 是一个相对独立的空间,保存到keychain钥匙串中的信息不会因为卸载/重装app而丢失, 。相对于NSUserDefaults、plist文件保存等一般方式,keychain保存更为安全。所以我们会用keyChain保存一些私密信息,比如密码、证书、设备唯一码(把获取到用户设备的唯一ID 存到keychain 里面这样卸载或重装之后还可以获取到id,保证了一个设备一个ID)等等
keychain是用SQLite进行存储的。用苹果的话来说是一个专业的数据库,加密我们保存的数据,可以通过metadata(attributes)进行高效的搜索。keychain适合保存一些比较小的数据量的数据,如果要保存大的数据,可以考虑文件的形式存储在磁盘上,在keychain里面保存解密这个文件的密钥。

详细讲解请点击链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值