zoukankan      html  css  js  c++  java
  • 关于plist文件的那些事

        今天遇到新生问一个问题,就是用自己定义了一个plist文件,然后可以往里面写东西,但是写过再次运行的时候里面的数据总是最后一次写入的数据。后来就专门研究了一下plist文件。

        大家都知道当你创建一个项目的时候,在Supporting Files中会有一个Info.plist文件,这个文件中存储的信息如下:

     它是整个APP的配置文件,包括了版本信息以及APP桌面显示名称等信息。可能是我还不太了解,但是经过我测试发现我无法用代码对Info.plist这个文件进行操作。

        先把plist文件放在一边,先了解一下文件目录,这个我认为很必要。直接看下图:

     

     我已经在上面都标注了一下用到的文件夹以及文件的作用,相信大家应该对整个目录结构有一个整体的了解。现在继续谈谈plist文件。

        用例子说明:比如我要做一个通讯录,想用plist文件去存放每个人的基本信息,包括姓名和电话。想要实现的最终效果是:

     那么我就可以这样做:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        NSString *rootPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
        NSString *path = [rootPath stringByAppendingPathComponent:@"user.plist"];
        
        NSMutableArray *totalArr = [[NSMutableArray alloc] initWithContentsOfFile:path];
        if(!totalArr)
        {
            totalArr = [NSMutableArray new];
        }
        NSMutableDictionary  *dic = [NSMutableDictionary new];
        [dic setObject:@“183434534535" forKey:@"telephone"];
        [dic setObject:@“王五" forKey:@“name"];
        [totalArr addObject:dic];
        [totalArr writeToFile:path atomically:YES];   
    } 

    第一步:我先获得刚才所说的那个存放我们自己创建的文件的目录Documents。

    NSString *rootPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;

    第二步:相当于字符串拼接,获取那个user.plist的绝对路径。

     NSString *path = [rootPath stringByAppendingPathComponent:@"user.plist"];

    第三步:我新建一个NSMutableArr,里面的数据来自于path所指向的文件,即plist文件。这样的话文件中的数据就可以写到totalArr中了

     NSMutableArray *totalArr = [[NSMutableArray alloc] initWithContentsOfFile:path];
    
        if(!totalArr)
    
        {
    
            totalArr = [NSMutableArray new];
    
        }

    注意,这里可能user.plist文件不存在,所以如果这个文件不存在,那么totalArr是没有创建成功的,所以加一个判断,如果totalArr没有创建成功(因为path下没有这个文件),就新建一个。

    第四步:新建一个字典,然后把字典放到totalArr中。

     NSMutableDictionary  *dic = [NSMutableDictionary new];
    
        [dic setObject:@“183434534535" forKey:@"telephone"];
    
        [dic setObject:@“王五" forKey:@“name"];
    
        [totalArr addObject:dic];    //这里我把新建的dic加入原来的数组中,这样就会把原来的数据也一并写入到plist文件中.
    View Code

    第五步:将totalArr写入plist文件中。

     [totalArr writeToFile:path atomically:YES];   

     注意:如果path下地那个文件不存在,这个writeToFile方法会自动创建一个user.plist文件。然后将totalArr中的数据写进去。

    这样就完成了。

        注意:plist文件写入时(即[totalArr writeToFile:path atomically:YES];),会先清空整个plist文件,然后从新将totalArr写到里面,所以为了保存原来写入的数据,需要在原来数组的基础上再加入一个新的dic( [totalArr addObject:dic]; ),这样就可以把原来的数据一块写入了。

        也许你会想直接在Supporting Files中新建一个plist文件不行么?答案是不行。具体原因可能如下:

      从上图可以看出,我新建的plist文件在项目文件夹下,根本没有在沙盒中。而且虽然我可以对这个文件进行读操作(用NSBundle操作),但是经过测试发现无法对其进行操作,具体原因不太清楚。

     但是我用

     NSString *testPath = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"plist”];

    去获取testPath时发现它的路径如下:

        /Users/admin/Library/Developer/CoreSimulator/Devices/F73D2947-21CC-4E8E-AE3E-D80E6652D840/data/Containers/Bundle/Application/C77E606F-AB5B-425A-BD2F-BC7B6B078187/test.app/test.plist

        仔细观察,原来这个文件是test.app中的文件,这样也合情理,因为这个test.app就是应用程序。我用上面的写入方法去写入数据时,发现我打开test.app下地test.plist。里面确实有数据,也就是说我把数据写进去了,但是当我查看Supporting Files文件夹下那个test.plist时,里面没有数据。而在次运行程序时,那个test.app会重新生成。里面的数据也都消失了。

    修订记录
    1、整理的了解------->整体的了解(2017年5月15日上午10:15修改)

  • 相关阅读:
    JAVA正则表达式判断元音
    JAVA正则表达式校验qq号码
    方法
    数组
    Java基础随笔3
    LDA背景资料
    scrapy系列(四)——CrawlSpider解析
    scrapy系列(三)——基础spider源码解析
    scrapy系列(二)——startproject、genspider创建项目与模板使用
    我眼中的机器学习(四) 快速寻找最优解
  • 原文地址:https://www.cnblogs.com/zhanggui/p/4423438.html
Copyright © 2011-2022 走看看