C语言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来进行数据持久化。     
    
  • 参照网站:
    1.http://www.jianshu.com/p/33e1d359f123
    2.http://my.oschina.net/u/1245365/blog/294449
    3.http://www.jianshu.com/p/99d2b873822c
    4.http://www.jianshu.com/p/4fc6c72b8674
    5.http://www.jianshu.com/p/8ca343c74554
    6.http://www.jianshu.com/p/d124f0ef7cb2
    7.http://www.jianshu.com/p/934a14e6de49
    8.http://www.jianshu.com/p/a6311b6df4dd
    9.http://www.jianshu.com/p/86ea6da905cf