博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
iOS开发备忘录:属性列表文件数据持久化
阅读量:4654 次
发布时间:2019-06-09

本文共 2601 字,大约阅读时间需要 8 分钟。

属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换。

NSArray类常用读写属性列表文件的方法

+arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象。

-initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象。

-writeToFile:atomically:该方法把NSArray对象写入到属性列表文件中,第一个参数是文件名,第二个参数为是否使用辅助文件,如果为YES,则先写入到一个辅助文件,然后辅助文件再重新命名为目标文件,如果为NO,则直接写入到目标文件。

NSDictionary类常用读写属性列表文件的方法:

+dictionaryWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSDictionary对象。

-initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSDictionary对象。

-writeToFile:atomically:该方法将NSDictionary对象写入到属性列表文件中。

属性列表文件数据持久化具体方法,可参考以下实现方式:

假如在项目中手工创建了一个Contacts.plist文件,并在该文件中添加了几条数据,如下图所示。

当然也可以通过代码直接创建plist文件。

接下来需要做的是将项目资源的Contacts.plist文件中数据复制到沙箱Documents目录下。

//对文件进行预处理,判断在Documents目录下是否存在plist文件,如果不存在则从资源目录下复制一个。-(void)createEditableCopyOfDatabaseIfNeeded{NSFileManager *fileManager=[NSFileManager defaultManager];NSString *writableDBPath=[self applicationDocumentsDirectoryFile];BOOL dbexits=[fileManager fileExistsAtPath:writableDBPath];if (!dbexits) {NSString *defaultDBPath=[[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Contacts.plist"];NSError *error;BOOL success=[fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];if (!success) {NSAssert1(0,@"错误写入文件:‘%@’",[error localizedDescription]);}}}//获取放置在沙箱Documents目录下的文件的完整路径-(NSString *)applicationDocumentsDirectoryFile{NSString *documentDirectory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];NSString *path=[documentDirectory stringByAppendingPathComponent:@"Contacts.plist"];return path;}

createEditableCopyOfDatabaseIfNeeded方法中

NSFileManager的copyItemAtPath:toPath:error:方法实现文件复制。

NSAssert1是Foundation框架提供的宏,它在断言失败的情况下抛出异常,类似的还有NSAssert和NSAssert2等。

applicationDocumentsDirectoryFile方法中

stringByAppendingPathComponent:能够在目录后面追加文件名,返回完整的文件路径。

沙箱Documents目录下成功生成plist文件之后,就可以进行增、删、改、查操作了。可参考如下代码:

NSString *path=[self applicationDocumentsDirectoryFile];//将属性列表文件内容读取到array变量中,也就是获取了属性列表文件中全部的数据集合NSMutableArray *array=[[NSMutableArray alloc]initWithContentsOfFile:path];//向array中添加一条新记录NSDictionary *newContact=[NSDictionary dictionaryWithObjects:@[contact.Title,contact.Type] forKeys:@[@"Title",@"Type"]];[array addObject:newContact];//删除array中一条记录[array removeObjectAtIndex:0];//删除array中全部记录    [array removeAllObjects];for (NSDictionary* dict in array) {//通过for循环,找到需要修改的数据项,进行修改数据[dict setValue:@"Test" forKey:@"Title"];}//将array重新写入属性列表文件中[array writeToFile:path atomically:YES];

注:完成后,需要选择Product->Clean菜单项清除一些再编译。

原文:http://www.cnblogs.com/wzk89/p/3939782.html

转载于:https://www.cnblogs.com/NINIiOS/p/4629325.html

你可能感兴趣的文章
微信小程序---数据缓存
查看>>
Python网页正文转换语音文件的操作方法
查看>>
常用SQL查询语句
查看>>
Redis Windows版安装详解
查看>>
linux后台运行python程序 nohup
查看>>
吴裕雄--天生自然 高等数学学习:对面积的曲面积分
查看>>
css
查看>>
Web应用程序整体测试基础——单元测试
查看>>
通过修改manifest文件来解决Vista/Win7/Win8/win10下应用程序兼容性问题
查看>>
Spark使用总结与分享
查看>>
JMETER - BEANSHELL获取响应结果
查看>>
Line 7.10 : Syntax error
查看>>
[转] 树状数组学习
查看>>
ASP.NET-ActionFilter过滤器用法实例
查看>>
将url的查询参数解析成字典对象
查看>>
Redis与RabbitMQ作为消息队列的比较
查看>>
mybatis实战教程三:mybatis和springmvc整合
查看>>
Java多线程:Semaphore
查看>>
960栅格化优势
查看>>
LSP原则—关于正方形不是长方形
查看>>