iOS-数据持久化-整合篇

前言:

在程序开发中,数据层永远是程序的核心结构之一。对这些数据的加工处理是代码中能体现技术水平的一大模块,比如数据的请求、解析、缓存、持久化等等。适当的对数据进行持久化存储可以实现应用的离线功能,以此提高用户体验。

一、简介

1.数据持久化方式(四种):
- 属性列表------->(plist)
- 数据归档 ------>(NSKeyedValueArchiver/NSUserDefaults)
- 数据库--------->(sqlite)
- coreData

2.区别:
  • 1.属性列表-plist
    简介:
    1.属性列表是一种XML格式的文件,拓展名为plist
    2.plist只能用数组(NSArray)或者字典(NSDictionary)进行读取,由于属性列表本身不加密,所以安全性几乎可以说为零。
    3.属性列表正常用于存储少量的并且不重要的数据。
    4.如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型就可以使用
    5.writeToFile:atomically: 方法直接将对象写到属性列表文件中
    ---
    优点:像字典一样的赋值方式方便简单
    缺点: 无法存储自定义的数据、不加密安全性低
  • 2.数据归档-NSKeyedArchiver/序列化
    1.数据归档是进行加密处理的,数据在经过归档处理会转换成二进制数据,所以安全性要远远高于属性列表。
    2.使用归档方式,我们可以将复杂的对象写入文件中,并且不管添加多少对象,将对象写入磁盘的方式都是一样的。
    3.使用NSKeyedArchiver对自定义的数据进行序列化,并且保存在沙盒目录下。
    *(注意:1.使用这种归档的前提是让存储的数据模型遵守NSCoding协议并且实现其两个协议方法。
    2.当然,如果为了更加安全的存储,也可以遵守NSSecureCoding协议,这是iOS6之后新增的特性)
  • 3.数据库
    简介:
    1.sqlite是一个轻量级、跨平台的小型数据库
    2.拥有可移植性高、有着和MySql几乎相同的数据库语句
    3.无需服务器即可使用
    ---
    优点:
    1.可以存储大量的数据,存储和检索的速度非常快
    2.能对数据进行大量的聚合,这样比起使用对象来进行这些操作要快。
    缺点:
    1.它没有提供数据库的创建方式;
    2.它基于C语言框架设计,没有面向对象的API,所以使用起来比较麻烦;
    3.复杂的数据模型的数据建表相对而言比较麻烦。
    ---
    注:当然,我们也可以使用基于sqlite封装的开源数据库FMDB来减少使用sqlite的工作量
  • 4.coreData
    简介:
    1.coreData是苹果官方iOS5之后推出的综合型数据库,其使用了ORM(Object Relational Mapping)对象关系映射技术,将对象转换成数据,存储在本地数据库中。
    2.coreData为了提高效率,甚至将数据存储在不同的数据库中,且在使用的时候将本地数据放到内存中使得访问速度更快。
    3.我们可以选择coreData的数据存储方式,包括sqlite、xml等格式。
    4.但也正是coreData 是完全面向对象的,其在执行效率上比不上原生的数据库。
    5.除此之外,coreData拥有数据验证、undo等其他功能,在功能上是四种持久化方案最多的。
二、基本用法--(归档、解档)
  • 1.属性列表--plist
  应用场景:
      最近在实现公司项目业务的时候,需要使用选择器(UIPickerView)给用户选择所在城市。对于城市数据,并没有加密的必要,
   而且这时候使用plist会达到更高一些的效率。既然已经知道需要的数据,那么很容易就得得出省-市这样的一对多的数据类型,
   我们的plist使用字典,将省份作为key,存储对应的城市的数组作为value。
  补充:
       实现选择器的大概思路是用两个数组分别存储省份以及当前选中省份的城市数组,
    然后在滑动pickerView的回调事件中根据选中的省份更新城市数据源。
   ---            
  #注意:详细过程请参考-参考网站所示。
  • 2.NSUserDefault--偏好设置Preference
   简介:
       1. 支持的数据格式有:NSNumber(Integer、Float、Double等)、NSString、NSDate、NSArray(成员必须也是支持的格式类型)、NSDictionary(同NSArray)。
       2.其使用和读取也是非常的简单,像字典一样的存取方式。
       3. NSUserDefaults 存储的对象全是不可变的
       4.存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选。
       5.但是如果我们自定义了一个对象,对象保存的是一些信息,这时候就不能直接存储到NSUserDefaults了
       6.本身不支持自定义对象的存储
   #存储: [[NSUserDefaults standardUserDefaults] setValue: @"str" forKey: @"str"];
   #读取: NSString * str =[[NSUserDefaultsstandardUserDefaults] valueForKey: @"str"];
   同样的也可以使用setObject:forKey:或者objectForKey:等字典存取方法

2.1例子①:
[简介]:如果想要将上述数据类型的数据永久保存到NSUserDefaults中去,
只需要简单的操作(一个Value 一个Key ),例如,想要保存一个NSString的对象,
代码实现为:
//将NSString 对象存储到 NSUserDefaults 中
NSString *passWord = @"1234567";
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setObject:passWord forKey:@"userPassWord"];
将数据取出也很简单,只需要取出key 对应的值就好了,
代码如下:
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *passWord = [ user objectForKey:@"userPassWord"];
#注意:对相同的Key赋值约等于一次覆盖,要保证每一个Key的唯一性
2.1例子②:使用方法
//1.获得NSUserDefaults文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
//2.向文件中写入内容
[userDefaults setObject:@"AAA"forKey:@"a"];
[userDefaults setBool:YES forKey:@"sex"];
[userDefaults setInteger:21 forKey:@"age"];
//2.1立即同步
#[userDefaults synchronize];
//3.读取文件
NSString *name = [userDefaults objectForKey:@"a"];
BOOL sex = [userDefaults boolForKey:@"sex"];
NSInteger age = [userDefaults integerForKey:@"age"];
NSLog(@"%@, %d, %ld", name, sex, age);
2.2如果我想要存储一个 NSMutableArray 对象?
#我必须先创建一个不可变数组(NSArray)再将它存入NSUserDefaults中去。
代码如下:
NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"123",@"234", nil];
NSArray * array = [NSArray arrayWithArray:mutableArray];
-
NSUserDefaults user = [NSUserDefaults standardUserDefaults];
[user setObject:array forKey:@"记住存放的一定是不可变的"];
#取出数据是一样的,想要用NSUserDefaults中的数据给可变数组赋值
/
-------------------------正确的赋值方法-------------- ----- */
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
//可以用alloc 方法代替
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:[user objectForKey:@"记住存放的一定是不可变的"]];

  • 2.3使用 NSUserDefaults 存储自定义对象
    2.3.1将自定义类型转换为NSData类型
    1.encodeWithCoder 方法 和 initWithCoder 方法
    2.应用场景
    #具体请过程请参考参考网站2
注意:
  1.偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
  2.如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
  3.偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。
  • 3.对象归档
   简介:
       1.对象归档是将对象归档以文件的形式保存到磁盘中(也称为序列化,持久化),使用的时候读取该文件的保存路径读取文件的内容(也称为接档,反序列化)。
       2.简单对象归档--使用的两个类:
                               1).NSKeyedArichiver
                               2).NSKeyedUnarchiver
    代码实现如下:
     NSKeyedArichiver、NSKeyedUnarchiver
     NSString *homeDirectory = NSHomeDirectory(); //获取根目录
     NSString homePath = [homeDirectory stringByAppendingPathComponent:@"自定义文件名,如test.archiver"];
     NSArray *array = @[@"abc", @"123", @12];
     Bool flag = [NSKeyedArichiver archiveRootObject:array toFile:homePath];
     if(flag) {
                   NSLog(@"归档成功!");
      }
  • 4.自定义内容归档
    逻辑思路:
    归档:
         1.使用NSData实例作为归档的存储数据
         2.添加归档的内容
         3.使用键值对
         4.完成归档
   解归档:
          1.从磁盘读取文件,生成NSData实例
          2.根据NSData实例和初始化解归档实例解归档
          3.根据key访问value
  • 5.SQLIte3
   上述方法都有一个致命的缺点,那就是都无法存储大批量的数据,有性能的问题。
   举例说明:使用归档。
    (1)数据的存取都必须是完整的,要求写入的时候要一次性写入,读取的时候要一次性全部读取,这涉及到应用的性能问题。
    (2)如果有1000条数据,此时要把第1001条数据存入,那么需要把所有的数据取出来,把这条数据加上去之后,再存入。
  • 6.CoreData
     了解:
         1.Core Data是苹果官方推荐使用的数据持久化方式。
         2.在使用的过程中,不需要导入数据库框架,也不需要使用sql语句操作数据库,完全是按照面向对象的思想,使用实体模型来操作数据库。
         3.在使用的过程中需要注意的是,如果模型发生了变化,可以选择重新生成实体类文件,但是自动生成的数据库并不会自动更新,需要考虑重新生成数据库,
         4. Core Data能够简化操作,但是它不支持跨平台使用,如果想实现跨平台,就需要使用SQLite来进行数据持久化。     
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容