【iOS】数据持久化(一)之Plist文件、Preference(NSUserDefaults类)

目录

    • 什么是Plist文件?
      • plist可以存储哪些数据类型
      • plist文件数据的读取与存储
    • Perference(NSUserDefaults)
      • 使用方法
      • registerDefaults: 方法的使用


什么是Plist文件?

Plist文件(属性列表)是将某些特定的类,通过XML文件的方式保存在目录中。

什么是 XML?
可扩展标记语言 (XML) 允许您以可共享的方式定义和存储数据。XML 支持计算机系统(如网站、数据库和第三方应用程序)之间的信息交换。预定义的规则简化了在任何网络上以 XML 文件的形式传输数据的过程,接收者可以使用这些规则准确高效地读取数据。

我们以 Xcode自动生成的plist文件为例,观察其结构,当我们新建一个项目时后,会发现有一个Info.plist文件,里面有很多参数和配置:
请添加图片描述
这是Xcode为我们自动生成的plist文件,用来保存当前项目的一些配置,Xcode为ta集成了很多预置的KeyValue

右键Info.plist文件->Open As->Source Code,用文本编辑器打开plist文件:
请添加图片描述
可以看到plist文件就是一个XML文件,key为键,string为对应的值

plist可以存储哪些数据类型

可以发现每一个键值对中间都有一个Type,不难理解这就是value的类型,右键查看:
请添加图片描述
plist文件可以被序列化的类型(可以被存储的类型)只有这几种:基本数据类型(NSStringNSNumberNSDateBOOL),对象数据类型(NSData/NSMutableData),集合类型(NSArray/NSMutableArrayNSDictionary/NSMutableDictionary),不能保存自定义对象

不难理解,这些数据可以被转换保存到一个纯文本文件(区别于二进制文件)中

plist文件数据的读取与存储

1. 读取
一般情况下,plist文件存储在沙盒的 /Documents中,所以要获取某个plist文件,只需要知道其文件名即可。用过以下方法获取plist数据(一般以NSArray或NSDictionary的形式保存):

//获取文件路径
NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString* fileName = [path stringByAppendingPathComponent: @"filename.plist"];//提取plist数据
NSArray* result = [NSArray arrayWithContentsOfFile: fileName];
NSLog(@"%@", result);

2. 存储

往plist文件写入数据直接用相应类型的writeToFile:方法即可

NSArray* array = @[@"ott", @"123", @"abc"];
[array writeToFile: fileName atomically: YES];

writeToFile: atomically:方法中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址,更安全的写入文件,一般该值为YES

运行后,Documents目录:
在这里插入图片描述
array以XML格式保存在本地

这个方法也可用于其他数据文件(.plist.txt.data等格式的文件),在沙盒中指定某一路径,新建并将数据文件保存在这一路径(同样,自定义对象是不能直接存入的,但是可以通过归档存为.data文件)

Perference(NSUserDefaults)

Perference(偏好设置)顾名思义就是专门用来存储系统的偏好配置、用户设置的参数和App的状态等少量信息的,一般不保存其他数据

使用NSUserDefaults类,以字典形式保存数据,iOS会自动把字典中的键值对转换成对应的XML文件(也就是plist文件),该文件存放在沙盒的 /Library/Preferences/ 目录下

NSUserDefaults是单例类,此类实际上就是对plist文件操作进行了封装,更方便我们直接操作

使用方法

  1. 获取NSUserDefaults文件
NSUserDefaults* userDefaults = [NSUserDefaults standardUserDefaults];
  1. 向plist文件写入内容
[userDefaults setObject: @"3G!!!" forKey: @"obj"];
[userDefaults setBool: YES forKey: @"isMale"];
[userDefaults setInteger: 20 forKey: @"age"];
  1. 立即同步
[userDefaults synchronize];

如果没有调用synchronize方法,系统会根据I/O情况(读取、写入和更新)不定时刻地将数据保存到文件中(以周期性间隔自动调用的同步方法使内存中的缓存与用户的默认数据库保持同步,而不是及时写入的),所以为防止在写完NSUserDefaults后程序退出导致数据丢失,需要立即写入文件的话就必须调用synchronize方法

  1. 读取文件中的内容
NSString* userName = [userDefaults objectForKey: @"obj"];
BOOL genderIsMale = [userDefaults boolForKey: @"isMale"];
NSInteger age = [userDefaults integerForKey: @"age"];
NSLog(@"%@ %d %ld", userName, genderIsMale, age);
[userDefaults removeObjectForKey: @"isMale"];

这样就会将所有数据保存到同一个文件中(即Preference目录下的一个以此应用包名称来命名的plist文件):
在这里插入图片描述

注:

返回值从NSUserDefaults是不可改变的,即使设置一个值可变对象。 例如,如果设置一个可变的字符串值作为"MyStringDefault",则稍后使用stringForKey:检索的字符串将是不可变的

registerDefaults: 方法的使用

NSUserDefaults除了保存和读取功能外,还为我们提供了一个很便捷的方法:registerDefaults:
请添加图片描述

ta的参数是一个字典类型,作用仅仅是为了定义一组默认的数据,这些默认的数据是不会被保存到plist文件中的,我们需要手动变更这些数据然后保存

举一个例子,我们可以使用这个方法来确认App是否是第一次启动:

//注册一个默认值
[userDefaults registerDefaults: @{@"firstRun" : @YES}];//第一次启动还没有生成plist文件,就会读取上面注册的默认值
BOOL isFirstRun = [userDefaults boolForKey: @"firstRun"];//是第一次启动
if (isFirstRun) {NSLog(@"这是第一次启动");//手动改为NO,保存到plist文件中[userDefaults setBool: NO forKey: @"firstRun"];
} else {NSLog(@"不是第一次启动");
}

再次强调,registerDefaults方法中的字典数据是不会保存到plist文件中的,当我们读取某个键值时,如果没有plist文件plist文件中没有找到对应的键值,那么就会从registerDefaults方法的字典参数中寻找对应的键值,拿到默认值。

当我们做了相应处理后,再手动把这个键值内容保存到plist中,下次读取就会是直接读取plist文件中的键值,而不是读取registerDefaults中参数的字典内容了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/212399.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python满屏表白代码

系列文章 序号文章目录直达链接1浪漫520表白代码https://want595.blog.csdn.net/article/details/1306668812满屏表白代码https://want595.blog.csdn.net/article/details/1297945183跳动的爱心https://want595.blog.csdn.net/article/details/1295031234漂浮爱心https://wan…

浅谈安科瑞直流电表在荷兰光伏充电桩系统中的应用

摘要:本文介绍了安科瑞直流电表在荷兰光伏充电桩系统中的应用。主要用于充电桩的电流电压电能的计量。 Abstract: This article introduces the application of Acrel DC meters in PV charging pile system in Netherlands.The device is measuring current,volt…

Python入门指南之基本概率和语法基础

文章目录 一、基本概念二、控制流三、函数四、模块五、数据结构六、面向对象的编程七、输入输出八、异常九、Python标准库关于Python技术储备一、Python所有方向的学习路线二、Python基础学习视频三、精品Python学习书籍四、Python工具包项目源码合集①Python工具包②Python实战…

反爬虫机制与反爬虫技术(二)

反爬虫机制与反爬虫技术二 1、动态页面处理与验证码识别概述2、反爬虫案例:页面登录与滑块验证码处理2.1、用例简介2.2、库(模块)简介2.3、网页分析2.4、Selenium准备操作2.5、页面登录2.6、模糊移动滑块测试3、滑块验证码处理:精确移动滑块3.1、精确移动滑块的原理3.2、滑…

机器学习实战-第3章 决策树

决策树 概述 决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。 决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在…

【操作系统】IO核心子系统原理讲解

文章目录 1. 前言2. 假脱机技术(SPOOLing技术)3. 设备分配与回收3.1 设备分配应考虑的因素3.2 静态分配与动态分配3.3 设备管理中的数据结构3.4 设备分配步骤3.5 设备的回收步骤 4. 缓冲区管理4.1 单缓冲4.2 双缓冲4.3 循环缓冲4.4 缓冲池 1. 前言 上篇…

项目环境配置 本地/测试/预发/生产

在本地目录下新建文件 dev测试环境 development 本地开发环境 production 生产环境 uat预发布环境 .env.dev VUE_APP_API_PATH /api # 测试 VUE_APP_API_PATH http:// # 生成dist名称 VUE_APP_DIST dist_dev .env.development # 本地开发环境 VUE_APP_API_PATH…

基于element-ui后台模板,日常唠嗑

后面会补充github地址 文章目录 目录 文章目录 案例说明 1.引入库 2.创建布局组件 3.创建布局组件 4.菜单效果展示 5.创建顶部组件 5.创建顶部面包屑组件 6.创建内容区域组件 7.效果总览 7.布丁(实现一些小细节) 前言一、pandas是什么?二、使…

【AIGC】信息量、熵、交叉熵、KL散度、二值交叉熵(Binary Cross-Entropy,BCE)

本文详细的推导了二值交叉熵(BCE)和二值交叉熵损失函数(BCE Loss)之间的关系。 一、 理论基础 A : f ( ⋅ ) A:f(\cdot) A:f(⋅) 表示 A A A定义为 f ( ⋅ ) f(\cdot) f(⋅),这是人们为了某些目的而将 A A A定义成 f ( ⋅ ) f(\cdot) f(⋅)的,有意义的…

爱创科技总裁谢朝晖荣获“推动医药健康产业高质量发展人物”

中国医药市场规模已经成为全球第二大医药市场,仅次于美国。近年来,随着中国经济的持续增长和人民生活水平的提高,医药市场需求不断扩大。政府对医疗卫生事业的投入也在不断加大,为医药行业的发展创造了良好的政策环境。为推动医药…

从入门到精通:JMeter接口测试全流程详解!

利用Jmeter做接口测试怎么做呢?过程真的是超级简单。 明白了原理以后,把零碎的知识点填充进去就可以了。所以在学习的过程中,不管学什么,我一直都强调的是要循序渐进,和明白原理和逻辑。这篇文章就来介绍一下如何利用…

华为昇腾开发板共享Windows网络上网的方法

作者:朱金灿 来源:clever101的专栏 为什么大多数人学不会人工智能编程?>>> 具体参考文章:linux(内网)通过window 上网。具体是两步:一是在windows上设置internet连接共享。二是打开Atlas 200I D…