关于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文件中.

第五步:将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会重新生成。里面的数据也都消失了。

时间: 2024-12-06 18:49:47

关于plist文件的那些事的相关文章

plist文件可以这样使用,

有的时候需要再Xcode工程目录中查看你自己创建的plist文件保存的大量数据,这样子比较方便处理一些应用.比如说给一个几千条记录的excel文件,保存的事汉字部首或者拼音信息,要制作一个字典查询功能,当然首先需要对excel的记录类容做解析处理,将它转换成plist文件形式会更方便我们的查看和使用: a.在使用excel数据的时候,将他处理成csv格式(txt): 这个步骤可以再文档编译器和Excel中完成,注释设置好解析格式,如添加分割判断字段等 b.让后使用通过图去文件的方法得到字符串,进

Cocos数据篇[3.4](4) ——plist文件操作

[唠叨] 在Cocos中,plist文件 是非常常见的配置文件.它是特定格式的xml文件. 例如:小图打包成大图的纹理图片.制作粒子特效.帧动画等,都用到了plist文件作为配置文件. 本节要介绍的是:如何创建plist文件,以及读取plist文件中的数据信息. [扩展阅读] http://zh.wikipedia.org/wiki/Plist (维基百科) http://zengrong.net/post/1981.htm (COCOS2D-X中的PLIST文件格式详解) http://cn.

什么是Plist文件

直接将数据直接写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低 因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码 一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也称为“plist文件” 解析Plist文件 获得Plist文件的全路径 NSBundle *bundle = [NSBun

解析plist文件(字典里包着数组,数组中又包含字典)

1 #import "RootTableViewController.h" 2 #import "City.h" 3 4 @interface RootTableViewController () 5 6 // 声明存放所有城市的大字典 7 @property (nonatomic, strong) NSMutableDictionary *allDataDict; 8 9 // 存储所有的key数组(存放省份) 10 @property (nonatomic, s

边练边学--plist文件,懒加载,模型初使用--补充instancetype

一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如果要变动数据,直接修改数据文件即可,不用修改代码 3>一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也成为“plist文件” 二.创建plist文件 三.解析plist文件 代码实

iOS-地图开发 Plist文件设置权限

解决办法: 在.Plist文件中添加 <key>NSLocationUsageDescription</key> <string>请点击“好”以允许访问. 若不允许,你将无法使用"发现"这个功能.</string> <key>NSLocationWhenInUseUsageDescription</key> <string> 请点击“好”以允许访问. 若不允许,你将无法使用"发现"这

iOS开发——数据持久化OC篇&amp;plist文件增删改查操作

Plist文件增删查改 主要操作: 1.//获得plist路径    -(NSString*)getPlistPath: 2.//判断沙盒中名为plistname的文件是否存在    -(BOOL) isPlistFileExists: 3.//读取沙盒中Document文件夹下的BookList.plist文件 [NSMutableDictionarydictionaryWithContentsOfFile:plistPath]; 4.//写入文件     if ([plistDictiona

SWIFT中将信息保存到plist文件内

在项目中可能我们需要保存一些数据到plist文件中,以下就本人在学习过程中的笔记,不成熟的地方请指出. 可能我有一个类叫做Student import UIKit class Student: NSObject { var text:String var age:Bool init(text:String,age:Int) { self.text = text self.age = age } //从nsobject中解析回来 init(coder aDecoder:NSCoder){ self

iOS工程中的info.plist文件的完整研究

原地址:http://blog.sina.com.cn/s/blog_947c4a9f0100zf41.html 们建立一个工程后,会在Supporting files下面看到一个"工程名-Info.plist"的文件,这个是对工程做一些运行期配置的文件,很重要,不能删除. 如果你在网上下载的工程中的这个文件名只是Info.plist,那么恭喜你,这个工程太老了,是用包含SDK2.0以前的Xcode生成的,不过没关系,不影响使用. 如果你使用文本编辑器打开这个文件,你会发现这是一个XM