当前位置: 首页 > news >正文

【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&#xff0c;求a的b次方。 输入 输入两个整数a&#xff0c;b&#xff08;1<a<10&#xff0c;1<b<15&#xff09;。 输出 输出一个正整数&#xff0c;该值<1000000000000。 输入样例 3 3 输出样例 27 参考答案 #include<bits/stdc.h&…...

扫雷游戏【可展开一片,超详细,保姆级别,此一篇足够】

一、C语言代码实现的扫雷游戏的运行 C语言实现扫雷 二、扫雷游戏的分析与设计 1.扫雷游戏的界面设计 在玩家玩扫雷的时候&#xff0c;它会给你一个二维的棋盘&#xff08;下面的讲解都以9x9规格为例子&#xff09;&#xff0c;然后点击你想排查的坐标&#xff0c;若不是雷的&…...

鸿蒙开发-DevEco Studio Profiler工具进行帧率分析

Frame Profiler概述 DevEco Studio内置Profiler分析调优工具&#xff0c;其中Frame分析调优功能&#xff0c;用于录制GPU数据信息&#xff0c;录制完成展开之后的子泳道对应录制过程中各个进程的帧数据&#xff0c;主要用于深度分析应用或服务卡顿丢帧的原因。此外&#xff0c…...

Google推出Telecom Jetpack库,让Android通话应用创建更简单

Google推出Telecom Jetpack库&#xff0c;让Android通话应用创建更简单 Telecom Jetpack库的最新Alpha版本已经推出。该库提供了多个API&#xff0c;以简化Android开发者创建语音和/或视频通话应用程序的过程&#xff0c;支持常见功能&#xff0c;例如接听/拒绝、音频路由等等…...

倒计时1天|解锁「PolarDB开发者大会」正确打开方式

1月17日 9:30-16:30 北京嘉瑞文化中心 PolarDB开发者大会 明天就要和大家就见面啦&#xff5e; 大会参会指南现已出炉 各位开发者们&#xff0c;请查收~ &#x1f447;&#x1f447;&#x1f447; 点击 大会主页 or 扫描上方二维码 一键抵达大会官网&#x1f447; 查看…...

链表-两两交换链表中的节点

给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 // 递归版本 class Solution {public ListNode swapPairs(ListNode head) {// base case 退出提交if(head nu…...

vue下载文件流效果demo(整理)

在 Vue 项目中&#xff0c;你可以使用 FileSaver.js 库来方便地下载文件流。FileSaver.js 封装了不同浏览器的下载方式&#xff0c;使得下载文件更加简单和兼容。以下是一个完整的示例方法&#xff1a; 首先&#xff0c;安装 FileSaver.js 库&#xff1a; <template>&l…...

【从0上手cornerstone3D】如何渲染一个基础的Dicom文件(含演示)

一、Cornerstone3D 是什么&#xff1f; Cornerstone3D官网&#xff1a;https://www.cornerstonejs.org/ 在线查看显示效果&#xff08;加载需时间&#xff0c;可先点击运行&#xff09;&#xff0c;欢迎fork 二、代码示例 了解了Cornerstone是什么&#xff0c;有什么作用后&…...

Unity3D PVP游戏位置同步算法优化详解

在Unity3D中&#xff0c;PVP&#xff08;Player versus Player&#xff09;游戏的位置同步是一项重要的技术&#xff0c;它决定了游戏中玩家之间的互动体验。本文将详细介绍Unity3D PVP游戏位置同步算法的优化方法&#xff0c;并给出相应的技术详解和代码实现。 对啦&#xff…...

【速成】蓝桥杯嵌入式省一教程

写在前面 蓝桥杯虽然是水赛&#xff0c;含金量不如其他老牌竞赛那么高&#xff0c;但对提高自身的能力还是有一定帮助的。无论你是想混个奖项加加综测分&#xff0c;还是想学学单片机、嵌入式的知识&#xff0c;蓝桥杯电子类的嵌入式竞赛都值得参加一次。当然蓝桥杯电子类竞赛…...

通过Lambda表达式获取字段列名,以及需要注意的地方

日常开发用MyBatis Plus的lambda表达式查询&#xff0c;不用手写column列名&#xff0c;不易出错且便于改动&#xff0c;如下&#xff1a; LambdaQueryWrapper<LanguageIntercept> lambdaQueryWrapper new LambdaQueryWrapper(); lambdaQueryWrapper.eq(LanguageInterc…...

消息队列的作用与使用场景?

一、消息队列的作用 队列的主要作用是消除高并发访问高峰&#xff0c;加快网站的响应速度。 在不使用消息队列的情况下&#xff0c;用户的请求数据直接写入数据库&#xff0c;在高并发的情况下&#xff0c;会对数据库造成巨大的压力&#xff0c;同时也使得系统响应延迟加剧。 …...

前端常见面试题之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请求 …...

林江院长:让斜视的孩子改“斜”归正,“正视”未来

读写时跳行、不敢和别人对视、拍照时不敢看镜头......这些不便是不少斜视患儿每天都在经历的日常。 斜视是目前儿童常见的眼科疾病之一&#xff0c;该眼病不仅给孩子的外在形象带来影响&#xff0c;更重要的是会影响双眼视功能及身心健康&#xff0c;其危害不容小觑。 7岁男孩晓…...

windows系统Mysql备份脚本

一.背景 用的windows server 2019服务器&#xff0c;mysql8.0.34&#xff0c;还是应该每天备份一下。以前做了很多次&#xff0c;主要是带了2个徒弟&#xff0c;还是要写出来。 二.备份脚本 chcp 936 set date_tmp%date:~0,10% set datetime%date_tmp:/%%time:~0,2%%time:~3,…...

localStorage、sessionStorage、vuex区别和使用感悟

一、介绍及区别 localStorage的生命周期是永久&#xff1b;不手动在浏览器提供的UI上清除localStorage信息&#xff0c;否则这些信息将永远存在。 sessionStorage的生命周期为当前窗口或标签页&#xff0c;一旦窗口或标签页被永久关闭&#xff0c;那么所有通过sessionStorage存…...

Linux用户提权

新建用户 用root账户修改文件&#xff0c;添加信任用户 使用sudo提权&#xff0c;可以使用 **root删除新建账户**...

ZooKeeper 安装

ZooKeeper 的安装包括单机模式安装&#xff0c;以及集群模式安装。 单机模式较简单&#xff0c;是指只部署一个 zk 进程&#xff0c;客户端直接与该 zk 进程进行通信。在开发测试环境下&#xff0c;通常来说没有较多的物理资源&#xff0c;因此我们常使用单机模式。 当然在单…...

利用快马平台快速构建鸿蒙pc镜像下载验证工具原型

最近在研究鸿蒙系统的PC版本适配工作&#xff0c;发现获取官方镜像是个不小的门槛。官方渠道的下载链接分散在不同页面&#xff0c;版本信息也不够直观&#xff0c;每次下载完还得手动校验文件完整性&#xff0c;整个过程相当繁琐。于是想做个工具来简化这个流程&#xff0c;正…...

OpenClaw技能市场:Qwen3.5-9B增强的自动化模块扩展

OpenClaw技能市场&#xff1a;Qwen3.5-9B增强的自动化模块扩展 1. 为什么需要技能市场&#xff1f; 去年我接手了一个内容运营项目&#xff0c;每天要处理大量重复性工作&#xff1a;从多个渠道收集资料、整理成Markdown格式、发布到不同平台。手动操作不仅耗时&#xff0c;还…...

告别手动重启!用宝塔PM2管理器实现Node.js热更新(2023最新配置指南)

2023终极指南&#xff1a;用宝塔PM2打造Node.js热更新开发流水线 每次保存代码都要手动重启服务&#xff1f;还在为部署中断用户体验而头疼&#xff1f;作为经历过数百次深夜紧急部署的全栈开发者&#xff0c;我总结出一套零中断热更新方案。只需15分钟配置&#xff0c;让你的N…...

基于潜在扩散模型的高分辨率图像合成-CVPR2022

期刊&#xff1a;Conference on Computer Vision and Pattern Recognition (CVPR) 论文链接&#xff1a;[2112.10752] High-Resolution Image Synthesis with Latent Diffusion Models 年份&#xff1a;2022 关键词&#xff1a;扩散模型&#xff0c;图像生成 从像素空间走向…...

Kubernetes与网络管理最佳实践

Kubernetes与网络管理最佳实践 1. Kubernetes网络模型 Kubernetes网络模型定义了集群中Pod、Service和外部网络之间的通信规则&#xff0c;是集群网络管理的基础。 1.1 网络模型核心原则 Pod间通信&#xff1a;所有Pod可以直接通信&#xff0c;无需NATPod与Service通信&#xf…...

STEP3-VL-10B开源大模型部署:从HuggingFace下载到CSDN算力上线全过程

STEP3-VL-10B开源大模型部署&#xff1a;从HuggingFace下载到CSDN算力上线全过程 想体验一个能看懂图片、理解图表、甚至帮你分析复杂文档的AI助手吗&#xff1f;今天要介绍的STEP3-VL-10B&#xff0c;就是一个让你用普通显卡就能跑起来的“多面手”AI模型。 你可能听说过那些…...

Win11Debloat深度优化指南:系统效能倍增的底层逻辑与实施路径

Win11Debloat深度优化指南&#xff1a;系统效能倍增的底层逻辑与实施路径 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter…...

5步打造高效工作流:Super Productivity开源工具新手实战指南

5步打造高效工作流&#xff1a;Super Productivity开源工具新手实战指南 【免费下载链接】super-productivity Super Productivity is an advanced todo list app with integrated Timeboxing and time tracking capabilities. It also comes with integrations for Jira, GitL…...

Cortex-M能否运行Linux?架构与系统需求解析

1. Cortex-M与Linux的兼容性解析作为一名嵌入式开发工程师&#xff0c;我经常被问到"Cortex-M能不能跑Linux"这个问题。要回答这个问题&#xff0c;我们需要从处理器架构和操作系统需求两个维度来分析。Cortex-M系列是ARM公司推出的微控制器内核&#xff0c;主要面向…...

STM32H7/TC397 PTP移植踩坑全记录:从Announce报文HardFault到Linux主机‘clock jumped’警告

STM32H7/TC397 PTP移植实战&#xff1a;从HardFault到时钟同步的深度排错指南 当我在TC397和STM32H7平台上移植PTP协议栈时&#xff0c;原以为只是简单的代码迁移&#xff0c;却意外开启了一场持续两周的"排错马拉松"。从诡异的HardFault到Linux主机不断报出的clock …...