美文网首页iOS高质量博客iOSiOS开发基础篇
iOS开发,plist文件读写那些事

iOS开发,plist文件读写那些事

作者: 林夕不昔 | 来源:发表于2016-09-29 10:55 被阅读17067次

    什么是plist文件?

    • plist文件,即属性列表文件,全名是Property List,这种文件的扩展名为.plist,因此,通常被叫做plist文件。它是一种用来存储串行化后的对象的文件,在iOS开发中通常用来存储用户设置,还可以用于存储程序中经常用到而不经常改动的数据。下面就看一下如何创建和读写plist文件。

    一、创建plist文件

    • 1、在程序中通过新建文件的方式创建
      快捷键 command + n
      或者File——>New——>File,选择iOS-->Resource-->Property List
    创建plist文件

    然后就是给文件命名:

    plist文件命名

    这里有一点需要注意:
    命名的时候不能用Info.plist , INfo.plist, xxxInfo.plist等形式,否则会出现下面的情况,因为系统中存在一个Info.plist文件,会发生冲突。

    命名中包含info的情况

    上图中的plist文件只能是NSDictionary类型,而且添加数据时会出现如下的情况:

    添加数据

    通常情况下,我们想要的并不是这种效果,所以命名的时候要注意。通常我们想要的plist文件是下图中的样子:

    在Root这一行,Type可以选择字典或数组。


    命名规范的情况

    点击Root这一行,然后通过点击右键->Add Row或者点击Root后面的加号来增加一行。这一行中包含三个属性,key、type、value。其中key是字段属性,type是字段类型,value是字段对应的值。而Type又包含7中类型,其中两种是Array和Dictionary,这两种是数组的形式,在它们下面还可以包含许多key-value。

    而另外5种是Boolean,data,string,date,number。这5种类型的数据都是被array和dictionary所要包含的数据。


    添加数据并赋值
    • 2、代码方式创建plist文件
      获取本地沙盒路径
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    

    获取完整路径

    NSString *documentsPath = [path objectAtIndex:0];
      NSString *plistPath = [documentsPath stringByAppendingPathComponent:@"newsTest.plist"];
    

    创建数据

    //创建数据
    NSMutableDictionary *newsDict = [NSMutableDictionary dictionary];
    //赋值
    [newsDict setObject:@"zhangsan" forKey:@"name"];
    [newsDict setObject:@"12" forKey:@"age"];
    [newsDict setObject:@"man" forKey:@"sex"];
    

    写入plist文件

    [newsDict writeToFile:plistPath atomically:YES];
    

    二、读取plist文件

    • 1、获取路径
      用新建文件的方式常见的plist文件,获取其路径的方法如下:
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"newsModel" ofType:@"plist"];
    

    代码方式创建的plist文件获取其路径的方式如下:

    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path1 = [pathArray objectAtIndex:0];
     NSString *myPath = [path1 stringByAppendingPathComponent:@"newsTest.plist"];
    
    • 2、读取数据
      文件是什么类型,就用什么类型的数据来接收
    //newsModel.plist文件
    NSMutableArray *data1 = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    //newsTest.plist文件
    NSMutableDictionary *data2 = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    

    数据输出如下:

    数据输出

    三、添加数据

    同样是先获取路径,注意获取路径的方式视情况而定:

    //用新建文件的方式常见的plist文件,获取其路径
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"newsModel" ofType:@"plist"];
    //代码方式创建的plist文件获取其路径
    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *path1 = [pathArray objectAtIndex:0];
    NSString *myPath = [path1 stringByAppendingPathComponent:@"newsTest.plist"];
    
    

    然后是取到数据:

    //newsModel.plist文件
    NSMutableArray *data1 = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    //newsTest.plist文件
    NSMutableDictionary *data2 = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    

    对数据进行操作,添加数据:

    //新建一个字典,设置属性值
    NSMutableDictionary *addData1 = [NSMutableDictionary dictionary];
    [addData1 setObject:@"123" forKey:@"title"];
    [addData1 setObject:@"pic.png" forKey:@"image"];
    [addData1 setObject:@"wobushi" forKey:@"detail"];
    //添加到数组中
    [data1 addObject:addData1];
    //写入文件
    [data1 writeToFile:filePath atomically:YES];
    
    //增加一个字段”job“,并设置属性值
    [data2 setObject:@"writer" forKey:@"job"];
    //写入文件
    [data2 writeToFile:plistPath atomically:YES];
    

    修改后的数据输出如下:

    添加数据

    以上就是plist文件的常用操作,当然,还可以进行修改删除等操作,方法类似,这里就不做描述了。

    相关文章

      网友评论

      • 像个被吓坏的孩子:代码方式创建plist文件,不需要使用FileManager来创建该文件吗
      • 长清lucky:hello 在吗? 工程目录下自己手动创建的plist文件通过代码去修改好像修改不了这个是为什么啊?沙盒里创建读取都没有问题的,能帮我解答一下吗?谢谢了
        林夕不昔:@YC_Oxygen 这个问题还没有解决,打印出来是有数据的,只是在plist文件中看不到变化,你可以试一试
      • 微小的沙土:求如何修改?我再重新写入键值字典,会把前面的都删掉了。。。。
        林夕不昔:@UnknownError 你是完全写入新的数据,还是先获取数据,再对数据进行操作的呢
      • 一点东风:请问在命令行工程下如何获取通过新建文件的方式创建的plist文件的相对路径,不是ios项目工程
        林夕不昔:不好意思,回复太晚,命令行工程下我也不知道:sob: :sob: :sob: ,感觉我有种找打的意思
      • 施主小欣:感谢楼主大大分享。。给我提供了很大的帮助!
        林夕不昔:@施主小欣 :stuck_out_tongue::stuck_out_tongue::stuck_out_tongue:
      • 郑一一一一:请问 我新建plist 文件的方式 保存了一份原始数据, 然后写入, 但是读取出来仍然是原始数据,是为什么?
        郑一一一一:我的理解和印象是bundle里的文件是不能写的!还要查证
        林夕不昔:@啊啦哈 写入之后打印出来是有新数据的,但是plist文件里没有新数据,这个问题我也没有搞清楚,还望多多指教啊:joy:
      • 风格随心:楼主,在吗?在的话回下简书信息,请教些问题:smile:
      • 小随记:博主 ,用新建文件的方式 读取数据后,新增或数据写入文件 ,我打开文件里面的数据并没有修改。
        //用新建文件的方式常见的plist文件,获取其路径
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"newsModel" ofType:@"plist"];
        //新建一个字典,设置属性值
        NSMutableDictionary *addData1 = [NSMutableDictionary dictionary];
        [addData1 setObject:@"123" forKey:@"title"];
        [addData1 setObject:@"pic.png" forKey:@"image"];
        [addData1 setObject:@"wobushi" forKey:@"detail"];
        //添加到数组中
        [data1 addObject:addData1];
        //写入文件
        [data1 writeToFile:filePath atomically:YES];
        小随记:@笔记之谈 沙盒里的plist文件数据内容会变 在工程里plist数据内容不会变
        小随记:@张小威 用新建文件的方式创建的plist文件 写入数据后,你再打开文件里面数据有变吗?(这个文件在工程里 不是在沙盒里)
        林夕不昔:@笔记之谈 我这边可以写入的,先取出plist文件里的数据,对数据进行操作,再把数据写入plist文件
        //取出plist文件
        NSMutableArray *data1 = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
        我当时写的时候选的数组类型,所以用数组接收的,这一点情况不同可能会有区别
      • Maj_sunshine:我想请问一下每次版本更新plist文件我应该做什么操作呢 不动会不会下个版本写不进去啊。:persevere:
        林夕不昔:@71b03c7180a1 版本更新的时候不会删除NSUserDefault中的数据,会保留,这个操作有什么影响要看你里面存了哪些信息了
        Maj_sunshine:@张小威 NSString*appDomain = [[NSBundlemainBundle]bundleIdentifier];

        [[NSUserDefaultsstandardUserDefaults]removePersistentDomainForName:appDomain];
        如果程序中做了这个操作会怎么样


        :cry:
        林夕不昔:@71b03c7180a1 plist不用做操作的,只要存的位置没变,文件名没变,就不影响的
      • 今晚月色:源代码还在吗! 求源代码和plist文件
        今晚月色:@张小威 谢谢啊 等有问题我在再找你吧!
        林夕不昔:@梦里落雪 这个不需要源码的,代码文章里都有了:smile: ,有问题再问我:stuck_out_tongue_winking_eye:
      • 51d110d37245:非常感谢,写的也非常详细
        林夕不昔:@麦兜是我滴 :smile: :smile: :smile:
      • EmptyWalker:博主,我在项目中新建一个plist文件,然后根据你获取路径的方法去获取到plist文件具体路径,再往路径中写入dic,但是我发现我创建的plist文件中并未添加到新的对象,但是我去沙盒中找到存储的plist文件,里面却有我保存的数据,为啥两个plist文件不一样哈
        林夕不昔:@爱吃桃子的小企鹅 通过新建文件的方式创建的plist文件存储在沙盒中,代码方式创建的文件不在沙盒中,你看看是不是路径取错了
        林夕不昔:通过新建文件的方式创建的plist文件存储在沙盒中,代码方式创建的文件不在沙盒中,你看看是不是路径取错了
      • 会跳舞的狮子:广州?
        会跳舞的狮子:@张小威 :+1:
        林夕不昔:@会跳舞的狮子 帝都

      本文标题:iOS开发,plist文件读写那些事

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