关于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:@“" 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:@“" 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会重新生成。里面的数据也都消失了。
修订记录:
1、整理的了解------->整体的了解(2017年5月15日上午10:15修改)
关于plist文件的那些事的更多相关文章
- ios开发学习- 简易音乐播放器2 (基于iPhone4s屏幕尺寸)-- 歌词解析--plist文件应用--imageNamed图片加载耗内存
声明:(部分图片来自网络,如果侵犯了您的权益请联系我,会尽快删除!) 又是音乐播放器,不过这次和上次不一样了,准确说这次更像播放器了,初学者不建议看这个,可以先看前面一个音乐播放器(1),当然 我没加 ...
- plist文件、NSUserDefault 对文件进行存储的类、json格式解析
========================== 文件操作 ========================== Δ一 .plist文件 .plist文件是一个属性字典数组的一个文件: .plis ...
- ios开发之Info.plist文件相关配置
前言:在iOS开发中有些情况下需要对Info.plist文件进行配置,以下介绍几种相关配置.以后遇到需要配置的再更新... 开发环境:swift3.0.1,Xcode8.1 一,项目中需要使用第三方字 ...
- Excel文件转plist文件出现的文件编码问题
今天在测试时遇到了需要将大量整理好的Excel数据转换为plist文件的情况.百度了一下教程,发现虽然别人也遇到过类似的情况,但是有些讲的还是不够细致.所以做如下整理. 百度到的内容中有使用Mes ...
- IOS学习笔记之获取Plist文件读取数据
@property(nonatomic,strong) NSArray *pic; //创建数组属性 @property(nonatomic,assign) int index; //创建索引属性 @ ...
- plist文件的读取和xib加载cell
plist 文件读取 例如在工程里倒入了plist文件 在工程里需要用到plist文件里的信息,就需要把plist文件读取出来. 如程序: -(NSArray *)moreDataArr{ if (! ...
- plist文件
1.一般可以使用属性列表文件存储NSArray或者NSDictionary之类的数据,这种“属性列表文件”的扩展名是plist,因此也称为“plist文件” 2.接下来通过代码来解析Plist文件中的 ...
- Reveal分析IOS界面,plist文件读取
Reveal分析IOS界面,需要得到app的 softwareVersionBundleId上传到iphone中 , 而IOS8的iTunesMetadata.plist (设备路径/var/mobi ...
- plist文件的使用
什么是plist文件 直接将数据写在代码里面,不是一种合理的做法.如果经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低 因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最 ...
随机推荐
- Java并发编程笔记之CopyOnWriteArrayList源码分析
并发包中并发List只有CopyOnWriteArrayList这一个,CopyOnWriteArrayList是一个线程安全的ArrayList,对其进行修改操作和元素迭代操作都是在底层创建一个拷贝 ...
- 在centos和redhat上安装docker
前置条件 64-bit 系统 kernel 3.10+一.检查内核版本,返回的值大于3.10即可 $ uname -r 二.使用 sudo 或 root 权限的用户登入终端 三.卸载旧版本(如果安装过 ...
- SaltStack数据系统-Grans详解
1:Grains是系统的一个组件,存放着minion启动时收集的系统底层的一些信息,每次minion启动的时候,会进行系统的采集,将其保存下来,在以后的生命周期中不会重新搜集,除非重启~ #查看gra ...
- Freemarker教程1(基本使用)
简介 FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页.电子邮件.配置文件.源代码等)的通用工具. 它不是面向最终用户的,而是一个Java类库,是 ...
- 2017 ACM/ICPC Asia Regional Qingdao Online解题报告(部分)
HDU 6206 Apple 题意: 给出四个点的坐标(每个点的坐标值小于等于1,000,000,000,000),问最后一个点是否在前三个点组成的三角形的外接圆内,是输出Accept,否输出Reje ...
- Java技术开发中的坑
1.(2014/05/28)struts2中使用eclipse自动获取getter和setter方法的坑 今天着实被eclipse坑了一把,平时遇到get和set方法时,我都是通过eclipse自动生 ...
- Java并发编程的艺术(一)
题目1 创建3个线程,让3个线程分别按着顺序打印AAAA,BBBB,CCCC(第一个线程打印AAAA,第二个线程打印BBBB,第一个线程始终在第二个线程之前打印) 代码(该代码为打印3个线程分别打印一 ...
- 《精通CSS层叠样式表》
书名 <精通CSS层叠样式表> 图片 时间 2017-7月 学习 感觉和ps一样对我都不友好 3天撸完
- WebFrom 【母版页】
ASP.NET中母版页作用 一是提高代码的复用(把相同的代码抽出来) 二是使整个网站保持一致的风格和样式. 母版页存在就一定要有内容页的存在,否则母版页的存在就没有了意义. .master 一.添加母 ...
- 乐字节-Java8新特性之Base64和重复注解与类型注解
上一篇小乐给大家说了<乐字节-Java8新特性之Date API>,接下来小乐继续给大家说一说Java8新特性之Base64和重复注解与类型注解. 一.Base64 在Java 8中,内置 ...