前言

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

  • 如果对象是 NSString、NSArray、NSDictionary、NSData 和 NSNumber 类型,可以用这些类中实现的 writeToFile: atomically: 方法将数据写到文件中。

  • 当根据字典创建属性列表时,字典中的键必须都是 NSString 对象。数组中的元素或字典中的值可以是 NSString、NSArray、NSDictionary、NSData、NSDate 和 NSNumber 对象。

  • iOS 实现的序列化方式的两种:NSKeyedArchiver,NSPropertyListSerialization。在这两种序列化方式中,NSData 都是序列化的目标。两种方式的不同点在于 NSPropertyListSerialization 是针对数组和字典类型的,而 NSKeyedArchiver 是针对对象的。

1、Write 写入方式

  • 永久保存在磁盘中。具体方法为:

    • 第一步:获得文件即将保存的路径:

      • 使用 C 函数 NSSearchPathForDirectoriesInDomains 来获得沙盒中目录的全路径。该函数有三个参数,目录类型、domain mask、布尔值。其中布尔值表示是否需要通过 ~ 扩展路径。而且第一个参数是不变的,即为 NSSearchPathDirectory 。在 iOS 中后两个参数也是不变的,即为:NSUserDomainMask 和 YES。

            NSString *documentPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
      • 还有一种方法是使用 NSHomeDirectory 函数获得 sandbox 的路径,但是不能在 sandbox 的本文件层上写文件也不能创建目录,而应该是此基础上创建一个新的可写的目录,例如 Documents, Library 或者 temp 。具体的用法为:

            // 将 Documents 添加到 sandbox 路径上NSString *documentPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];
      • 这两者的区别就是:使用 NSSearchPathForDirectoriesInDomains 比在 NSHomeDirectory 后面添加 Documents 更加安全。因为该文件目录可能在未来发送的系统上发生改变。

    • 第二步:生成在该路径下的文件:

          // fileName 就是保存文件的文件名NSString *FileName = [documentPath stringByAppendingPathComponent:@"fileName"];
    • 第三步:往文件中写入数据:

          // 将 NSData 类型对象 data 写入文件,文件名为 FileName[data writeToFile:FileName atomically:YES];
    • 第四步:从文件中读出数据:

          // 从 FileName 中读取出数据NSData *data = [NSData dataWithContentsOfFile:FileName options:0 error:NULL];

2、Plist 文件的读写

    NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayToPList.plist"];NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryToPList.plist"];// 待写入数据NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"];// 待写入数据NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"};// 写 Plist 文件// 数组写入 plist 文件BOOL bl1 = [array writeToFile:arrayPath atomically:YES];// 字典写入 plist 文件BOOL bl2 = [dictionary writeToFile:dictionaryPath atomically:YES];// 读 Plist 文件NSArray *arrayFromPlist = [NSArray arrayWithContentsOfFile:arrayPath];NSDictionary *dicFromPList = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];

3、Plist 序列化

    NSString *arrayPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/arrayPropertyList.plist"];NSString *dictionaryPath = [NSHomeDirectory() stringByAppendingString:@"/Desktop/dictionaryPropertyList.plist"];// 待写入数据NSArray *array = @[@"bei", @"jing", @"huan", @"ying", @"nin"];                                                  // 待写入数据NSDictionary *dictionary = @{@"name":@"chen chao", @"age":@"18", @"info":@"Good Teacher"};                      // 序列化,将数据转换成 XML 格式的文件NSData *arrayData = [NSPropertyListSerialization dataWithPropertyList:array format:NSPropertyListXMLFormat_v1_0 options:1 error:nil];NSData *dictionaryData = [NSPropertyListSerialization dataWithPropertyList:dictionary format:NSPropertyListXMLFormat_v1_0 options:1 error:nil];// 输出到 .txt 格式文件中BOOL bl1 = [arrayData writeToFile:arrayPath atomically:YES];                                                    BOOL bl2 = [dictionaryData writeToFile:dictionaryPath atomically:YES];// 反序列化NSArray *arrayFromeFile = [NSArray arrayWithContentsOfFile:arrayPath];NSDictionary *dicitionaryFromeFile = [NSDictionary dictionaryWithContentsOfFile:dictionaryPath];

4、Plist 文件的使用

4.1 Plist 文件的创建

4.2 Plist 文件的解析

    // 获得 Plist 文件的全路径NSString *path = [[NSBundle mainBundle] pathForResource:@"shops" ofType:@"plist"];// 加载 plist 文件NSArray *shops = [NSArray arrayWithContentsOfFile:path];

4.3 Plist 文件的解析过程

4.4 Plist 的使用注意

  • plist 的文件名不能叫做 “info”、“Info” 之类的。

  • 添加 plist 等文件资源的时候,一定要勾选下面的选项。

转载于:https://www.cnblogs.com/QianChia/p/5782843.html

iOS - OC PList 数据存储相关推荐

  1. iOS - OC NSUserDefaults 数据存储

    前言 @interface NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefaults ...

  2. iOS开发之数据存储

    概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...

  3. iOS - Swift NSUserDefaults 数据存储

    前言 public class NSUserDefaults : NSObject 用来保存应用程序设置和属性.用户保存的数据.用户再次打开程序或开机后这些数据仍然存在.如果往 userDefault ...

  4. iOS实现iCloud数据存储-Swift3.0

    前言:作为一名swift初学者,我希望能通过写文章的方式来更好地帮助自己学习,更希望能得到你的建议和批评.如有纰漏之处,还望不吝赐教. 一.简介 在使用一些不需要服务端支持的App时,我发现部分App ...

  5. iOS - OC SQLite 数据库存储

    前言 采用 SQLite 数据库来存储数据.SQLite 作为一中小型数据库,应用 iOS 中,跟前三种保存方式相比,相对比较复杂一些. 注意:写入数据库,字符串可以采用 char 方式,而从数据库中 ...

  6. php nsdata,iOS开发之数据存储之NSData

    1.概述 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象. NSDat ...

  7. IOS中的数据存储 简单总结

    1.  NSKeyedArchiver(加密形式) 2.  plist 3.  NSUserDefaults 4.  writeToFile  5.  SQLite3 ==== NSKeyedArch ...

  8. iOS开发之数据存储之Preference(偏好设置)

    1.概述 很多iOS应用都支持偏好设置,比如保存用户名.密码.字体大小等设置,iOS提供了一套标准的解决方案来为应用加入偏好设置功能. 每个应用都有个NSUserDefaults实例,通过它来存取偏好 ...

  9. IOS数据存储5种方式

    iOS中的数据存储(上) iOS应用数据存储的常用方式: 应用沙盒: 应用沙盒结构分析 Documents: temp: Library/Caches: Library/Preference: 沙盒根 ...

最新文章

  1. 模拟IO 读写压力测试
  2. Deseq的理论基础
  3. 时间序列研(part12)--习题
  4. python模型部署方法_终极开箱即用的自动化Python模型选择方法
  5. 【】MTCNN基于NCNN的测试过程
  6. 用TextPaint来绘制文字
  7. 流浪地球开机动画包zip_影视日报|合家欢动画电影quot;许愿神龙quot;定档1.15;流浪地球加长版定档11.26...
  8. 数组逆序重存放(信息学奥赛一本通-T1105)
  9. 源码解析之HashMap实现原理
  10. 10.27T1 堆贪心
  11. java 定时任务的实现_Java定时任务实现的几种方式
  12. java物联网第三天 智慧农业物联网
  13. linux串口工具 kermit,Linux下串口工具kermit的安装使用攻略
  14. 使用高德地图API实现历史轨迹查询
  15. 最近 火火火火 的 GitHub 项目!
  16. Redhat_rhel_linux镜像下载,持续更新......
  17. 删掉微信好友服务器还有吗,微信被删除的好友怎么找回来 在对方不知情的情况下找回已删除的微信好友教程...
  18. java class常用反编译操作
  19. HDU——解题报告 1060
  20. js画图开发库--mxgraph--[wires-电路图.html]

热门文章

  1. Installing ROS 2 on Ubuntu20.04 Linux
  2. VSCode 更新后打不开之解决办法
  3. 获取map第一个的key和value_谁要是再敢用Map传参,我过去就是一JIO
  4. 北斗导航 | PPP-RTK技术研究进展与试验验证(第十一届中国卫星导航年会报告)
  5. Qt学习(三):事件、定时器、事件过滤器
  6. mysql数据库扫描_使用nmap对mysql 数据库进行扫描
  7. C语言面向对象编程(三):虚函数与多态
  8. VC++得到系统特殊文件夹路径
  9. 【深度学习】6万字解决算法面试中的深度学习基础问题
  10. 【深度学习】聊聊Batch Normalization在网络结构中的位置