【iOS】数据存储方式总结(持久化)沙盒结构
在iOS开发中,我们经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等,本篇文章将介绍六个主要的数据存储方式
iOS中数据存储方式(数据持久化)
根据要存储的数据大小、存储数据以及存储类型,存储方式主要分为一下几种:
- Plist(属性列表),不能存放自定义对象
- Preference(偏好设置/NSUserDefaults)
- NSCoding(NSKeyedArchiver/NSKeyedUnarchiver,归档/解档)
- SQLite3
- Core Data(面向对象)
- FMDB
【iOS】数据持久化(一)之Plist文件、Preference(NSUserDefaults类)
【iOS】数据持久化(二)之归档和解档(iOS 13以后)
【iOS】数据持久化(三)之SQLite3数据库
【iOS】数据持久化(四)之FMDB
Core Data是苹果官方提供的数据持久化解决方案,无需借助第三方框架,但学习门槛较高,编者目前课业较为紧张,以后会深入学习…🙏🏻
沙盒机制
在研究存储方式之前,我们有必要先研究一下这些文件会存储到什么地方,这就需要我们了解iOS App特有的沙盒机制

如图为沙盒目录结构,参考(苹果官方文档)
iOS程序默认情况下只能访问自己的目录,这个目录被称为 “沙盒”
沙盒其实就是每一个iOS App特有的一个文件夹,每个iOS App都有自己的应用沙盒(文件系统目录),其结构和目录特性都是一样的
沙盒目录与其他文件系统隔离,应用必须呆在自己的沙盒里,其他应用不能访问该沙盒
简言之,应用只能访问自己应用下的文件
沙盒结构
每个App的沙盒都是由下图所示的四部分组成,每一部分中存放的数据和内容都是有一定的规范和性质的:

直接通过NSHomeDirectory()可以得到该沙盒路径:
NSString* path = NSHomeDirectory();
NSLog(@"%@", path);
沙盒目录特性
沙盒中每个文件夹都有各自的特性,所以在选择存放目录时,一定要选择合适的目录
- 应用程序包: 除沙盒目录之外,每一个App还有一个Bundle目录,即 “应用程序包(Application)”,该目录下存放的是应用程序的源文件,包括资源文件和可执行文件,上架前经过数字签名,上架后不可修改。获取Bundle路径的方法是:
NSString* path = [[NSBundle mainBundle] bundlePath];
NSLog(@"%@", path);
如果需要借用某个App的图标或贴图,可以在该App中的程序应用包中找到.app结尾的源文件,然后右键点击显示包内容即可直接获取到其所有的图标和贴图
- Documents: 保存应用运行时生成的需要持久化的数据,iTunes同步该应用时会同步该文件夹中的内容,适合存储重要数据。获取该文件路径的方法是:
NSString* path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSLog(@"%@", path);
- Library/Caches: iTunes同步该应用时不会同步该文件夹中的内容,适合存储体积大、无需备份的非重要文件。比如网络数据缓存就会存储到cache文件中:
//获取Library:NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject
NSString* path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
NSLog(@"%@", path);
- Library/Preferences: iTunes同步该应用时会同步此文件夹的内容,通常保存应用的偏好设置,使用
NSUserDefaults类来获取和设置应用的偏好 - tmp: iTunes不会同步此文件夹,此目录用于存放临时数据,使⽤完毕后相应的文件会从该目录删除,保存应用程序再次启动过程中不需要的信息
NSString* path = NSTemporaryDirectory();
NSLog(@"%@", path);
NSSearchPathForDirectoriesInDomains

- directory 表明我们要搜索的目录名称,比如
NSDocumentDirectory搜索Documents目录、NSCachesDirectory搜索Library/Caches目录 - domainMask 指定搜索范围,
NSUserDomainMask表示搜索范围限制在当前应用的沙盒目录,还有NSLocalDomainMask(表示/Library)、NSNetworkDomainMask(表示/Network) - expandTilde BOOL值,表示是否展开波浪线。
比如该值为YES表示路径写成全写形式:/Users/Username/Library/Developer/CoreSimulator/Devices/8D71115A-D081-4440-9C94-13BD102412DB/data/Containers/Data/Application/D53B8C34-A16B-4A3D-9931-001D06F0C51F/Library/Caches
该值为NO表示路径写成:~/Library/Caches
相关文章:
【iOS】数据存储方式总结(持久化)沙盒结构
在iOS开发中,我们经常性地需要存储一些状态和数据,比如用户对于App的相关设置、需要在本地缓存的数据等等,本篇文章将介绍六个主要的数据存储方式 iOS中数据存储方式(数据持久化) 根据要存储的数据大小、存储数据以及…...
硬盘重新分区怎么恢复分区之前的文件?
分区是常见的故障,通常由多种原因引起。一方面,硬盘老化或者受到损坏可能会导致分区表出现问题;另一方面,用户误操作,如格式化或分区不当,也可能导致分区丢失。针对此问题,解决方法包括使用专业…...
C++每日一练(15):简单幂计算
题目描述 输入两个数a和b,求a的b次方。 输入 输入两个整数a,b(1<a<10,1<b<15)。 输出 输出一个正整数,该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…...
扫雷游戏【可展开一片,超详细,保姆级别,此一篇足够】
一、C语言代码实现的扫雷游戏的运行 C语言实现扫雷 二、扫雷游戏的分析与设计 1.扫雷游戏的界面设计 在玩家玩扫雷的时候,它会给你一个二维的棋盘(下面的讲解都以9x9规格为例子),然后点击你想排查的坐标,若不是雷的&…...
鸿蒙开发-DevEco Studio Profiler工具进行帧率分析
Frame Profiler概述 DevEco Studio内置Profiler分析调优工具,其中Frame分析调优功能,用于录制GPU数据信息,录制完成展开之后的子泳道对应录制过程中各个进程的帧数据,主要用于深度分析应用或服务卡顿丢帧的原因。此外,…...
Google推出Telecom Jetpack库,让Android通话应用创建更简单
Google推出Telecom Jetpack库,让Android通话应用创建更简单 Telecom Jetpack库的最新Alpha版本已经推出。该库提供了多个API,以简化Android开发者创建语音和/或视频通话应用程序的过程,支持常见功能,例如接听/拒绝、音频路由等等…...
倒计时1天|解锁「PolarDB开发者大会」正确打开方式
1月17日 9:30-16:30 北京嘉瑞文化中心 PolarDB开发者大会 明天就要和大家就见面啦~ 大会参会指南现已出炉 各位开发者们,请查收~ 👇👇👇 点击 大会主页 or 扫描上方二维码 一键抵达大会官网👇 查看…...
链表-两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 // 递归版本 class Solution {public ListNode swapPairs(ListNode head) {// base case 退出提交if(head nu…...
vue下载文件流效果demo(整理)
在 Vue 项目中,你可以使用 FileSaver.js 库来方便地下载文件流。FileSaver.js 封装了不同浏览器的下载方式,使得下载文件更加简单和兼容。以下是一个完整的示例方法: 首先,安装 FileSaver.js 库: <template>&l…...
【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)
一、Cornerstone3D 是什么? Cornerstone3D官网:https://www.cornerstonejs.org/ 在线查看显示效果(加载需时间,可先点击运行),欢迎fork 二、代码示例 了解了Cornerstone是什么,有什么作用后&…...
Unity3D PVP游戏位置同步算法优化详解
在Unity3D中,PVP(Player versus Player)游戏的位置同步是一项重要的技术,它决定了游戏中玩家之间的互动体验。本文将详细介绍Unity3D PVP游戏位置同步算法的优化方法,并给出相应的技术详解和代码实现。 对啦ÿ…...
【速成】蓝桥杯嵌入式省一教程
写在前面 蓝桥杯虽然是水赛,含金量不如其他老牌竞赛那么高,但对提高自身的能力还是有一定帮助的。无论你是想混个奖项加加综测分,还是想学学单片机、嵌入式的知识,蓝桥杯电子类的嵌入式竞赛都值得参加一次。当然蓝桥杯电子类竞赛…...
通过Lambda表达式获取字段列名,以及需要注意的地方
日常开发用MyBatis Plus的lambda表达式查询,不用手写column列名,不易出错且便于改动,如下: LambdaQueryWrapper<LanguageIntercept> lambdaQueryWrapper new LambdaQueryWrapper(); lambdaQueryWrapper.eq(LanguageInterc…...
消息队列的作用与使用场景?
一、消息队列的作用 队列的主要作用是消除高并发访问高峰,加快网站的响应速度。 在不使用消息队列的情况下,用户的请求数据直接写入数据库,在高并发的情况下,会对数据库造成巨大的压力,同时也使得系统响应延迟加剧。 …...
前端常见面试题之ajax、http
文章目录 一、手写ajax请求1. get2. post3. xhr.readyState4. xhr.status5. xhr.open 二、跨域三、cookie、localStorage和sessionStorage四、http1. http常见的状态码有哪些2. http常见的header有哪些3. 什么是RestfulAPI4. 描述一下http的缓存机制5. https 一、手写ajax请求 …...
林江院长:让斜视的孩子改“斜”归正,“正视”未来
读写时跳行、不敢和别人对视、拍照时不敢看镜头......这些不便是不少斜视患儿每天都在经历的日常。 斜视是目前儿童常见的眼科疾病之一,该眼病不仅给孩子的外在形象带来影响,更重要的是会影响双眼视功能及身心健康,其危害不容小觑。 7岁男孩晓…...
windows系统Mysql备份脚本
一.背景 用的windows server 2019服务器,mysql8.0.34,还是应该每天备份一下。以前做了很多次,主要是带了2个徒弟,还是要写出来。 二.备份脚本 chcp 936 set date_tmp%date:~0,10% set datetime%date_tmp:/%%time:~0,2%%time:~3,…...
localStorage、sessionStorage、vuex区别和使用感悟
一、介绍及区别 localStorage的生命周期是永久;不手动在浏览器提供的UI上清除localStorage信息,否则这些信息将永远存在。 sessionStorage的生命周期为当前窗口或标签页,一旦窗口或标签页被永久关闭,那么所有通过sessionStorage存…...
Linux用户提权
新建用户 用root账户修改文件,添加信任用户 使用sudo提权,可以使用 **root删除新建账户**...
ZooKeeper 安装
ZooKeeper 的安装包括单机模式安装,以及集群模式安装。 单机模式较简单,是指只部署一个 zk 进程,客户端直接与该 zk 进程进行通信。在开发测试环境下,通常来说没有较多的物理资源,因此我们常使用单机模式。 当然在单…...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真
目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销,平衡网络负载,延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
