原文:https://www.jianshu.com/p/b37c1bcf8cdc
前言
在iOS开发过程中,我们会经常用到数据持久化问题,作为数据持久化解决方案之一,plist的使用是一个很方便快捷的方案。
plist保存的地方
1,工程沙盒里(就是程序user Document文件夹下,以读取文件,写入文件方式)
2,工程自身里(就是在工程里手动创建一个如.plist文件,把固定的内容写入,这个需要人工手动写入)
3,工程沙盒里(保存到user Document下,不过不需要读写文件,用系统的 NSUserDefaults 可以快速保存添加读取删除基本数据类型,类似于android里的Sharedpreferences )
plist是什么?
它全名是:Property List,属性列表文件,它是一种用来存储串行化后的对象的文件。属性列表文件的扩展名为.plist ,因此通常被称为 plist文件。文件是xml格式的。Plist文件通常用于储存用户设置,也可以用于存储捆绑的信息。
如何使用plist——plist的读取,修改和删除
plist的读取(使用在工程自身里的方式)
创建一项测试project
1.png
创建一个plist文件
2.png
3.png
在plist中添加一些信息
4.png
plist可以支持很多类型数据包括字典和数组
5.png
读取代码
- (void)viewDidLoad { [superviewDidLoad];//读取plist[selfgetDataFromPlist];}- (void)getDataFromPlist{NSString*plistPath = [[NSBundlemainBundle]pathForResource:@"PropertyListTest"ofType:@"plist"];NSMutableDictionary*dataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];NSLog(@"%@",dataDic);//直接打印数据}
打印结果
6.png
plist的修改写入
(之前有说,保存在工程自身的plist并不能修改写入,所以这里需要通过沙盒路径创建plist并修改保存,还有一个坑,模拟器与真机权限可能不一致,在模拟机上能够通过nsbundle路径修改成功,但是真机上并不能,所以建议需要修改的plist都使用沙盒路径来新建和修改并且两者所获取的plist并不是同一个文件,代码解释如下)
- (void)viewDidLoad { [superviewDidLoad];//读取plist[selfgetDataFromPlist];// 写入plist[selfwriteDataToPlist];}
- (void)getDataFromPlist{//沙盒获取路径NSArray*pathArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*path = [pathArray objectAtIndex:0];//获取文件的完整路径NSString*filePatch = [path stringByAppendingPathComponent:@"PropertyListTest.plist"];//没有会自动创建NSLog(@"file patch%@",filePatch);NSMutableDictionary*sandBoxDataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:filePatch];if(sandBoxDataDic==nil) { sandBoxDataDic = [NSMutableDictionarynew]; sandBoxDataDic[@"test"] =@"test"; [sandBoxDataDic writeToFile:filePatch atomically:YES]; }NSLog(@"sandBox %@",sandBoxDataDic);//直接打印数据//工程自身的plist NSString*plistPath = [[NSBundlemainBundle]pathForResource:@"PropertyListTest"ofType:@"plist"];NSMutableDictionary*dataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];NSLog(@"nsbundle %@",dataDic);//直接打印数据}
- (void)writeDataToPlist{//这里使用位于沙盒的plist(程序会自动新建的那一个)NSArray*pathArray =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);NSString*path = [pathArray objectAtIndex:0];//获取文件的完整路径NSString*filePatch = [path stringByAppendingPathComponent:@"PropertyListTest.plist"];NSMutableDictionary*sandBoxDataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:filePatch];NSLog(@"old sandBox is %@",sandBoxDataDic); sandBoxDataDic[@"test"] =@"hello world"; [sandBoxDataDic writeToFile:filePatch atomically:YES]; sandBoxDataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:filePatch];NSLog(@"new sandBox is %@",sandBoxDataDic);//这里使用的是位于工程自身的plist(手动新建的那一个)NSString*plistPath = [[NSBundlemainBundle]pathForResource:@"PropertyListTest"ofType:@"plist"];NSMutableDictionary*dataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];//开始修改及写入NSNumber*number = @10; dataDic[@"1"] = number;//修改NSNumber*boolNumber = [NSNumbernumberWithBool:YES];//bool值只能通过nsnumber修改dataDic[@"3"] = boolNumber; [dataDic writeToFile:plistPath atomically:YES];//重新获取数据 看是否有变动(虚拟机上会有变动,但是真机上不会)NSMutableDictionary*newDataDic = [[NSMutableDictionaryalloc]initWithContentsOfFile:plistPath];NSLog(@"new %@",newDataDic);//打印新数据}
虚拟机上的打印结果(bundle和sandbox都修改成功)
虚拟机测试结果
真机上的打印结果(bundle修改失败,sandbox修改成功)
真机测试结果
注意bool值的修改与一般值修改不一样,是需要nsnumber作为中间转换
Way NO.3 UserDefaults
plist文件读取的三种方式还有一种就是使用UserDefaults来访问一个特殊的plist文件,使用方法简单,不需要文件读取,使用系统方法,这里就不再介绍UserDefaults了,读者可自行Google。