iOS中四种存储方式
来源:互联网 发布:linux中rpm文件 编辑:程序博客网 时间:2024/06/06 08:33
数据储存,首先要明确是是数据结构和存储方式。数据结构就是数据存在的形式,存储方式分两种,分别是内存和闪存。内存存储是临时的,运行时有效的,但效率高,而闪存则是一种持久化存储,但产生I/O消耗,效率相对低。把内存数据转移到闪存中进行持久化的操作称成为归档。
下面介绍四种数据储存方案:
- NSUserDefaults,用于存储配置信息
- SQLite,用于存储查询需求较多的数据
- CoreData,用于规划应用中的对象
- 使用基本对象类型定制的个性化缓存方案
用NSUserDefaults存储配置信息
NSUserDefaults被设计用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。它通过一个工厂方法返回默认的、也是最常用到的实例对象。这个对象中储存了系统中用户的配置信息,开发者可以通过这个实例对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。
<pre name="code" class="objc">//保存数据:NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];NSString *name =@”default string“;[defaults setObject:firstName forKey:@"name"];UIImage *image=[[UIImage alloc]initWithContentsOfFile:@"photo.jpg"];NSData *imageData = UIImageJPEGRepresentation(image, 100);//UIImage对象转换成NSData[defaults synchronize];//用synchronize方法把数据持久化到standardUserDefaults数据库//读取数据:NSUserDefaults *defaults =[NSUserDefaults standardUserDefaults];NSString *name = [defaults objectForKey:@"name"];//根据键值取出nameNSData *imageData = [defaults dataForKey:@"image"];UIImage *Image = [UIImage imageWithData:imageData];//NSData转换为UIImage
NSUserDefaults把配置信息以字典的形式组织起来,支持字典的项包括:字符串或者是数组,除此之外还支持数字等基本格式。一句话概括就是:基础类型的小数据的字典。操作方法几乎与NSDictionary的操作方法无异,另外还可以通过指定返回类型的方法获取到指定类型的返回值。
NSUserDefaults的所有数据都放在内存里,因此操作速度很快,并还提供一个归档方法:+ (void)synchronize。开发者自定义的配置项会以plist格式的文件归档在相应应用目录的/Library/Preferences/[App_Bundle_Identifier].plist文件。再次初始化获得实例对象后,框架会把用户自定义的这个配置和系统配置合并得到完整数据。
用SQLite存储查询需求较多的数据
iOS的SDK里预置了SQLite的库,开发者可以自建SQLite数据库。SQLite每次写入数据都会产生IO消耗,把数据归档到相应的文件。
SQLite擅长处理的数据类型其实与NSUserDefaults差不多,也是基础类型的小数据,只是从组织形式上不同。开发者可以以关系型数据库的方式组织数据,使用SQL DML来管理数据。 一般来说应用中的格式化的文本类数据可以存放在数据库中,尤其是类似聊天记录、Timeline等这些具有条件查询和排序需求的数据。
每一个数据库的句柄都会在内存中都会被分配一段缓存,用于提高查询效率。另一个方面,由于查询缓存,当产生大量句柄或数据量较大时,会出现缓存过大,造成内存浪费。
用CoreData规划应用中对象
正如上图所示,MyDocument是一个对象实例,有两个Collection:Employee和Department,存放各自的对象列表。MyDocument、Employee和Department三个对象以及他们之间的关系都通过CoreData建模,并可以通过save方法进行持久化。
从归档文件还原模型时CoreData并不是一次性把整个模型中的所有数据都载入内存,而是根据运行时状态,把被调用到的对象实例载入内存。框架会自动控制这个过程,从而达到控制内存消耗,避免浪费。
无论从设计原理还是使用方法上看,CoreData都比较复杂。因此,如果仅仅是考虑缓存数据这个需求,CoreData绝对不是一个优选方案。CoreData的使用场景在于:整个应用使用CoreData规划,把应用内的数据通过CoreData建模,完全基于CoreData架构应用。
使用基本对象类型定制的个性化缓存方案
之前提到的NSUserDefaults和SQLite适合存储基础类型的小数据,而CoreData则不适合存储单一的数据,那么对于类似图片这种较大的数据要用什么方式储存呢?我给出的建议就是:自己实现一套存储方案。说到订制存储方案大家非常容易质疑,这是不是又在重新发明轮子。我可以非常明确的告诉大家,这绝不是在重新发明轮子。首先要明确,这个所谓的定制方案适用于互联网应用中对远程数据的缓存,几个限制条件缺一不可。
从需求出发分析缓存数据有哪些要求:按Key查找,快速读取,写入不影响正常操作,不浪费内存,支持归档。这些都是基本需求,那么再进一步或许还需要固定缓存项数量,支持队列缓存,缓存过期等。从这些需求入手设计一个缓存方案并不十分复杂。
以上介绍了几种iOS开发中经常会遇到的储存数据方法,从其存储原理、使用方式和适用场景几方面进行进了简单的对比。事实上每一款应用都很难采用一种单一的方案完成整个应用的数据储存任务,需要根据不同的数据类型,选择最合适的方案,以便整个应用获得良好的运行时性能。
- iOS中四种存储方式
- ios常见存储方式
- IOS存储方式
- IOS数据存储方式
- iOS数据存储方式
- iOS数据存储方式
- ios 数据存储方式
- ios数据存储方式FMDB
- iOS数据存储方式总结
- ios数据存储方式FMDB
- ios数据存储方式FMDB
- iOS - 数据存储方式FMDB
- iOS中数据存储方式
- ios中的数据存储方式
- iOS-数据存储方式介绍
- iOS数据存储方式总结
- ios 数据存储常用方式
- iOS存储方式之归档
- pandas.read_sql(),读取sqlite3保存的数据说明
- 转载--网页性能管理详解
- MySQL备忘录
- VS2010出现如下链接错误:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
- STM32F4_TIM基本延时(计数原理)
- iOS中四种存储方式
- iOS-多线程之NSOperation
- AppCan4.0:开发者要做有价值的APP
- html (jsp )表单元素总结
- 我的activemq JDBC Master Slave主从和持久化配置过程
- 编程技巧 - 9
- IOS 使用 CAEmitterLayer实现粒子效果
- linux应用程序调试gdb+gdbserver
- 博客地址