美文网首页
iOS 数据的存储之 Property List (属性列表)

iOS 数据的存储之 Property List (属性列表)

作者: Cc馒头 | 来源:发表于2019-02-20 18:16 被阅读0次

    在每一个APP中,数据持久化是必要的,也是我们都需要掌握的,那么什么才是持久化呢?所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。有时当我们在无网络的情况也要显示数据信息的时候,那么数据的持久化就起到了作用。

    目录

    1、 Property List (属性列表)
    2、NSUserDefaults (偏好设置)
    3、NSKeyedArchiver (归档)
    待续。。。


    (一)Property List (属性列表)

    简介:我们经常在项目中可以看到info.plist文件,这个文件就是属性列表文件,简称plist文件。这一类文件,只能存储系统直带的数据类型,不支持自定义对象存储,一般是用来存储数据量小,而且内容不容易变更的数据。

    主要用途:接口名、城市名、银行名称 等。

    存储类型:NSString、NSNumber、BOOL、NSDictionary、NSArray、NSData、NSDate 等。

    1、创建plist文件:

    ① 快捷键创建:command + N 选择 Property list
    ② 右击文件目录 ---> 选择"New File..." --->选择"Property List" ---> 输入plist文件名并在窗口中点击Create创建


    创建plist正确的打开方式
    2、plist的赋值:
    plist的赋值
    3、plist的使用方式(如下代码)

    1)获取文件路径

        NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *fileName = [path stringByAppendingPathComponent:@"city.plist"];
    
    

    2)plist文件的存储(写入)

    *注:atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
    
         2.1 NSMutableDictionary 的存储方式
         NSMutableDictionary *dic = [NSMutableDictionary dictionary];
         [dic setObject:@"18" forKey:@"age"];
         [dic setObject:@"胡杨" forKey:@"name"];
         [dic writeToFile:plistPath atomically:YES];
    
        2.2 NSArray 的存储方式
        NSArray *array = @[@"1",@"2",@"3",@"4"];
        [array writeToFile:fileName atomically:YES]; 
    
    

    3)plist文件的读取

        3.1 NSMutableDictionary 的读取方式
        NSString *plistPath = [fileName stringByAppendingPathComponent:@"myTestPlist.plist"];//fileName为文件路径
        NSMutableDictionary *dataDic = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
    
        3.2 NSArray 的读取方式
        NSString *plistPath = [fileName stringByAppendingPathComponent:@"myTestPlist.plist"];//fileName为文件路径
        NSArray *result  = [NSArray arrayWithContentsOfFile: plistPath];
    
    

    (二)NSUserDefaults (偏好设置)

    简介:NSUserDefaults 也是只能保存系统自带的数据类型,不能保存自定义的类型。NSUserDefaults是将输入的数据保存在plist文件下,数据是自动保存在Libarary/Preferences目录下。有时候需要保存用户数据,但是数据量又不是很多,用SQLite3觉得不大合适,这时候用UserDefaults偏好设置是一个不错的选择。

    存储类型:NSString、NSNumber、BOOL、NSDictionary、NSArray、NSData、NSDate 等。

    1、NSUserDefaults 的使用

    1)数据的写入

        //获得NSUserDefaults文件
        NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    
        //数据保存到NSUserDefaults中
        [userDefaults setObject:@"张三" forKey:@"UserName"];
        [userDefaults setBool:YES forKey:@"UsrSelected"];
        [userDefaults setObject:dictionary forKey:@"DefaultUserData"];
    
         //立即同步
        [userDefaults synchronize];
    
    

    2)数据的读取

        //获得NSUserDefaults文件
        NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    
        //读取对于的数据
        NSString *name = [userDefaults objectForKey:@"UserName"];
        BOOL sex = [userDefaults boolForKey:@"UsrSelected"];
        NSMutableDictionary *userdictionary = [userDefaults objectForKey:@"DefaultUserData"];
    
    

    3)删除NSUserDefaults 对于的数据

        //获得NSUserDefaults文件
        NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
    
        //删除对于的数据
        [userDefault removeObjectForKey:@"DefaultUserData"];
    
        //立即同步
        [userDefault synchronize];
    
    

    (三)NSKeyedArchiver (归档)

    简介:归档在iOS 中是另外一种形式的序列化,可以储存自定义数据类型。使用归档,必须遵守NSCoding协议或者NSSecureCoding协议,绝大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议(如果采用NSSecureCoding协议,必须重写supportsSecureCoding 方法并返回YES)。而相对于Plist和NSUserDefaulst的存储方式而言,归档后的文件是加密过的,所以安全性相比之下比较高。

    1、举例子说明

    1)创建UserObject

    UserObject.h
    
    @interface UserObject : NSObject<NSCoding>
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    
    //自定义的归档保存数据的方法
    + (void) saveUser:(UserObject *)user;
    
    //自定义的读取沙盒中解档出的数据
    + (UserObject *) getUser;
    
    
    UserObject.m
    
    #import "UserObject.h"
    @implementation UserObject
    
    /** 描述当前对象里面的哪些属性要归档  aCoder:用来归档 */
    - (void) encodeWithCoder:(NSCoder *)aCoder{
      [aCoder encodeObject:_name forKey:@"name"];
      [aCoder encodeInteger:_age forKey:@"age"];   
    }
    
    /** 描述当前对象里面的哪些属性要解档 */
    - (instancetype) initWithCoder:(NSCoder *)coder{
        if (self  = [super init]) {
        //注意一定要给成员变量赋值保存起来
         _name = [aDecoder decodeObjectForKey:@"name"];
         _age = [aDecoder decodeIntForKey:@"age"];
        return self;
    }
    
    //自定义的归档保存数据的方法
    + (void) saveUser:(UserManager *)user{
        NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *path = [docPath stringByAppendingPathComponent:@"UserInfo.plist"];
        [NSKeyedArchiver archiveRootObject:user toFile:path];
    }
    
    //自定义的读取沙盒中解档出的数据
    + (UserManager *) getUser{
        NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        NSString *path = [docPath stringByAppendingPathComponent:@"UserInfo.plist"];
        UserManager *user = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        return user;
    
    }
    

    2)创建ViewController,并且使用归档

    ViewController.m 
    /** 自定义对象想要归档,则自定义对象必须遵守NSCoding协议,实现协议方法 */
    
    #pragma mark - NSKeyedArchiver(归档)
    - (void) keyedArchiverSaveOnUserData {
        UserObject *userSaveObject = [[UserObject alloc]init];
        userSaveObject.name = @"张三";
        userSaveObject.age = 15;
        [UserObject saveUser: userSaveObject];//归档
        self.saveLabel.text = [NSString stringWithFormat:@"%@ %zd", userSaveObject.name, userSaveObject.age];
    }
    
    #pragma mark - NSKeyedArchiver(解档)
    - (void)keyedArchiverReadOnUserData {
        UserObject *userReadObject = [UserObject getUser];//解档
        self.readLabel.text = [NSString stringWithFormat:@"%@ %zd", userReadObject.account, userReadObject.age];
    }
    

    相关文章

      网友评论

          本文标题:iOS 数据的存储之 Property List (属性列表)

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