• iOS数据持久化存储之属性列表


     属性列表(plist)

      iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist。如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使用writeToFile:atomically:⽅法 直接将对象写到属性列表文件中该格式保存的数据可以直接使用NSDictionary和NSArray读取 

    (一)、使用NSUserDefault 实现持久化

         下面来看下 NSUserDefault 本地保存的位置,数据持久化之沙盒目录有提及。Library/Preferences 这个目录下的 plist 文件就是其保存的目录。
          NSUserDefault 的用法,主要是保存和读取

          初始化一个 NSUserDefault

         + (NSUserDefaults *)standardUserDefaults;

         设置数据的方法

          - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;    

          - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;   

          - (void)setFloat:(float)value forKey:(NSString *)defaultName;

          - (void)setDouble:(double)value forKey:(NSString *)defaultName;

          - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;

          - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

         读取数据的方法:

          - (nullable id)objectForKey:(NSString *)defaultName; 

          - (nullable NSString *)stringForKey:(NSString *)defaultName;

          - (nullable NSArray *)arrayForKey:(NSString *)defaultName;

          - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;

          - (nullable NSData *)dataForKey:(NSString *)defaultName;

          - (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;

          - (NSInteger)integerForKey:(NSString *)defaultName;

          - (float)floatForKey:(NSString *)defaultName;

          - (double)doubleForKey:(NSString *)defaultName;

          - (BOOL)boolForKey:(NSString *)defaultName;

          - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

          删除数据的方法:

           - (void)removeObjectForKey:(NSString *)defaultName;

          保存数据:

         // 如果不手动调用,系统会自动保存,但时间不定

           - (BOOL)synchronize;    

        使用方法

        //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"];


       // 存储id类型数据

         + (void)setValue:(id)value andKey:(NSString *)key

        {

            NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

            [userDefaults setObject:value forKey:key];

            [userDefaults synchronize];

        }

    // 获取数据

        + (NSString *)getValueByKey:(NSString *)key

        {

            NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

            NSString *value = [settings objectForKey:key];

            return value;

         }

       注意:

          偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
          如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
          偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

     

     (二)、手动添加plist文件

          新建文件-->Resource-->Property List

           输入图片说明

               

        plist文件的根类型只能是NSArray或NSDictionary

         输入图片说明

        输入图片说明

          将plist文件中的数据读入对应的根类型

        // 1、获取文件所在的路径,Resource:文件名称、Type:文件格式

        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];

        // 2、从路径中获取对应格式的数据

        // 如果Root为NSArray,则使用数组保存

        NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];

        NSLog(@"%@",infos);

        // 如果Root为NSDictionary,则使用字典保存

        NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];

        NSLog(@"%@",infoDic);

     (三)、直接讲数据写入plist文件

          由于 NSUserDefault 本质上就是通过 plist 文件来实现属性的持久化。所以,我们可以通过自己创建一个 plist 文件来实现属性的持久化。

            NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    
            NSString *docPath = [path objectAtIndex:0];
    
            NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];
    
            NSMutableDictionary *contentDic;
    
            // 判断本地是否存在 plist 文件
            if ([[NSFileManager defaultManager] fileExistsAtPath:myFile] == NO) {
                NSFileManager* fm = [NSFileManager defaultManager];
                // 创建一个文件
                [fm createFileAtPath:myFile contents:nil attributes:nil];
                contentDic = [[NSMutableDictionary alloc] init];
            } else {
                contentDic = [[NSMutableDictionary alloc] initWithContentsOfFile:myFile];
            } 
            // 数据的读写操作
            [contentDic setObject:@"1234" forKey:@"passWord"];
            // 将修改都的数据保存到 plist 文件中
            [contentDic writeToFile:myFile atomically:YES];

    (四)、总结
        plist文件的读写效率比较高,由于他的读写需要将所有的数据取出再全部保存,所以只适合小数据。

  • 相关阅读:
    linux查看端口命令 lsof netstat
    基于神经网络集成学习的研究论文推荐
    在没有训练数据的情况下通过领域知识利用弱监督方法生成NLP大型标记数据集
    旷视MegEngine是如何将31*31的大核卷积计算速度提高10倍的
    LAB03:升级K8S版本
    LAB01:权限控制RBAC
    LAB04:备份还原ETCD
    LAB02:指定节点不可用
    vue2.0增删改查 关键词检索怎么做
    【Vue实例实战】商城后台管理系统——增删改查
  • 原文地址:https://www.cnblogs.com/496668219long/p/5627931.html
Copyright © 2020-2023  润新知