iOS 数据存储的常用方式

作者: iOS_成才录 | 来源:发表于2015-11-12 19:27 被阅读7656次

    一、iOS应用数据存储的常用方式

    • 1、XML属性列表(plist)归档
    • 2、Preference(偏好设置)
    • 3、NSKeyedArchiver归档(NSCoding) // 所谓归档,是一个过程,即用某种格式来保存一个或者多个对象,以便以后还原这些对象
    • 4、SQLite3
    • 5、Core Data

    二、数据存储

    1、 pist文件读与写

    • 特点:只能存储OC常用数据类型(NSString、NSDictionary、NSArray、NSData、NSNumber等类型)而不能直接存储自定义模型对象

      • 如果想存储自定义模型对象 -> 只能将自定义模型对象转换为字典存储;
    • 1.1 使用须知:

      • 前提条件:一个对象必须实现了writeToFile方法,因为我们是通过调用对象的writeToFile方法将对象写入到一个plist文件中的
       // 将数组写入plist文件:(系统提供的类实现的writeToFile方法)
       [array writeToFile:filePath atomically:YES];
      
      • plist只能识别字典,数组
    • 1.2 读写数据 - > 实例代码

       NSString *docPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES)[0];
        // 拼接要保存的地方的路径
        NSString *filePath = [docPathstringByAppendingPathComponent:@"str.plist"];
        // 1、写入数据
        [array writeToFile:filePath atomically:YES];
        // 2、 读取数据
        NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
    

    **​2、偏好设置: **

    • 每个应用都有个NSUserDefaults实例,通过它来存取偏好设置,比如,保存用户名、字体大小、是否自动登录

    • 2.1 好处:

      • 1.存储数据不需要关心文件名称
      • 2.快速存储键值对
    • 2.2 底层实现:

      • 它其实就是一个字典
    • 2.3 用途: 账户或者密码,开关状态

    • 2.4 注意:设置数据时,synchornize方法强制写入

      • UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写入本地磁盘。所以调用了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调用synchornize方法强制写入
    • 2.5 基本使用

        NSUserDefaults *UserDefaults = [NSUserDefaultsstandardUserDefaults];
        // 1、写入
        [UserDefaults setBool:NO forKey:@"isLogined"];
        // 强制写入
        [defaults synchornize];  
     
        // 2、读取
        BOOL isVisble = [UserDefaults boolForKey:@"isLogined"];
    

    3、获取临时文件夹路径

    //    3.1 获取临时文件夹路径
        NSString *tmp = NSTemporaryDirectory();
    //    3.2 定义宏,快速访问临时文件夹中文件
    #define FilePath [NSTemporaryDirectory() stringByAppendingPathComponent:@"person.data"]
    

    4、归档 NSKeyedArchiver

    • 特点:

        1. 可以存储自定义模型对象
        • NSKeyedArchiver归档相对较plist存储而言,它可以直接存储自定义模型对象,而plist文件需要将模型转为字典才可以存储自定义对象模型;
      • 2.归档不能存储大批量数据(相比较Sqlite而言),存储数据到文件是将所有的数据一下子存储到文件中,从文件中读取数据也是一下子读取所有的数据;
    • 缺点:

      • 假如你的文件中有100个对象了,然后你想在利用归档添加一个对象,你需要先把所有的数据解档出来,然后再加入你想添加的那个对象,同理,你想删除一个文件中的一个对象也是,需要解档出所有的对象,然后将其删除。性能低这样处理
    • 4.1 基本使用:需要归档的模型类必须要遵守NSCoding协议,然后模型实现类中必须实现两个方法:1>encodeWithCoder -> 归档;2> initWithCoder: - > 解档

    • 4.2 使用注意:

      • 如果父类也遵守了NSCoding协议,请注意:

    应该在encodeWithCoder:方法中加上一句

    [super encodeWithCode:encode]; // 确保继承的实例变量也能被编码,即也能被归档
    
    应该在initWithCoder:方法中加上一句
    
    self = [super initWithCoder:decoder]; // 确保继承的实例变量也能被解码,即也能被恢复
    
    
    + 基本使用
    
    ```objc
    // 1. 自定义模型类Person
    
    // 1.1 Person.h文件
    #import <Foundation/Foundation.h>
    
    // 只要一个自定义对象想要归档,必须要遵守NSCoding协议,并且要实现协议的方法
    @interface Person : NSObject<NSCoding>
    
    @property (nonatomic, assign) int age;
    
    @property (nonatomic, strong) NSString *name;
    
    @end
    
    // 1.2 .m实现文件
    #import "Person.h"
    
    #define KName @"name"
    #define KAge @"age"
    
    @implementation Person
    
    // 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
    // 作用:告诉苹果当前对象中哪些属性需要归档
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
     [aCoder encodeObject:_name forKey:KName];
     [aCoder encodeInt:_age forKey:KAge];
    }
    
    // 什么时候调用:当一个对象要解档的时候就会调用这个方法解档
    // 作用:告诉苹果当前对象中哪些属性需要解档
    // initWithCoder什么时候调用:只要解析一个文件的时候就会调用
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
     #warning  [super initWithCoder]
     if (self = [super init]) {
         // 解档
         // 注意一定要记得给成员属性赋值
       _name = [aDecoder decodeObjectForKey:KName];
       _age = [aDecoder decodeIntForKey:KAge];
     }
     return self;
    }
    
    @end
    
    // 2. 实例 -》基本使用:取 / 存 数据 
    // 归档
    [NSKeyedArchiver archiveRootObject: self.persons toFile:KFilePath];// 将self.persons模型对象数组 
     
    // 解档       
    _persons = [NSKeyedUnarchiver unarchiveObjectWithFile:KFilePath];
    

    5、SQLite3

    • 它是一款开源的嵌入式关系型数据库,可移植性好、易使用、内存开销小
    • 特点:可以存储大量数据
    • 详情,请参见 【SQLite3篇】

    6、Core Data

    • Core Data框架提供了对象-关系映射(ORM)的功能
      • 即能够将OC对象转化成数据,保存在SQLite3数据库文件中,也能够将保存在数据库中的数据还原成OC对象。
    • 在此数据操作期间,不需要编写任何SQL语句
    • 使用此功能,要添加CoreData.framework和导入主头文件<CoreData/CoreData.h>
    • 详情,请参见【Core Data篇】

    相关文章

      网友评论

        本文标题:iOS 数据存储的常用方式

        本文链接:https://www.haomeiwen.com/subject/jcxqhttx.html