【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

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

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

相关文章

案例:应用内字体大小调节

文章目录 介绍相关概念完整实例 代码结构解读保存默认大小获取字体大小修改字体大小 介绍 本篇Codelab将介绍如何使用基础组件Slider,通过拖动滑块调节应用内字体大小。要求完成以下功能: 实现两个页面的UX:主页面和字体大小调节页面。拖动…

算法训练营第34天|● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

文档讲解:代码随想录 (programmercarl.com) 视频讲解:代码随想录的个人空间-代码随想录个人主页-哔哩哔哩视频 (bilibili.com) LeetCode 1005.K次取反后最大化的数组和 题目链接:1005. K 次取反后最大化的数组和 - 力扣(LeetCode…

基于物联网设计的智能储物柜(4G+华为云IOT+微信小程序)

一、项目介绍 在游乐场、商场、景区等人流量较大的地方,往往存在用户需要临时存放物品的情况,例如行李箱、外套、购物袋等。为了满足用户的储物需求,并提供更加便捷的服务体验,当前设计了一款物联网智能储物柜。 该智能储物柜通…

git提交报错:remote: Please remove the file from history and try again.

1. 报错信息 remote: error: File: fba7046b22fd74b77425aa3e4eae0ea992d44998 500.28 MB, exceeds 100.00 MB. remote: Please remove the file from history and try again. git rev-list --objects --all | grep fba7046b22fd74b77425aa3e4eae0ea992d44998 2. 分析原因 e…

打架识别摄像机

随着社会治安问题的增加,打架事件在公共场所频繁发生,给社会治安带来了一定程度的威胁。因此,为了提高公共场所的安全性,可以利用现代科技,如人工智能和摄像技术,开发一种打架识别摄像机。 这种摄像机可以通…

基于 IDEA 进行 Maven 工程构建

一、构建概念和构建过程 项目构建是指将源代码、依赖库和资源文件等转换成可执行或可部署的应用程序的过程,在这个过程中包括编译源代码、链接依赖库、打包和部署等多个步骤。 项目构建是软件开发过程中至关重要的一部分,它能够大大提高软件开发效率&…

【Docker】CentOS stream 上安装 Docker 环境详细指南

文章目录 1. 定义2. 优势3. 安装1)Linux 上安装(强烈推荐)2)Windows 和 MAC 上安装 4. 验证1)查看版本2)运行 Hello World 总结 Docker 是一种轻量级的容器化技术,提供了一种在不同环境中快速、…

Maven普通工程和web工程创建

文章目录 创建项目前设置maven工程前设置工作创建项目前--》设置utf-8配置maven参数Maven普通工程和web工程创建Maven简单工程第一步:File–New–Project 第二步:选择maven然后下一步:填写后询选择finish初始化maven工程目录简介maven简单工程…

vue3 | 自定义遮罩层组件

组件模板 <template><Teleport to"body" :disabled"!appendToBody"><div v-bind"$attrs" v-show"modelValue" class"maskLayer-overlay" :style"{ background }"><div class"maskLaye…

python中字符串常用的操作

在Python中&#xff0c;字符串是一种不可变的序列类型&#xff0c;它支持许多常用的操作。以下是一些常见的字符串操作&#xff1a; 字符串拼接&#xff1a; 使用 运算符可以将两个字符串拼接在一起。 str1 "Hello" str2 "World" result str1 "…

Rust-借用检查

Rust语言的核心特点是&#xff1a;在没有放弃对内存的直接控制力的情况下&#xff0c;实现了内存安全。 所谓对内存的直接控制能力&#xff0c;前文已经有所展示&#xff1a;可以自行决定内存布局&#xff0c;包括在栈上分配内存&#xff0c;还是在堆上分配内存&#xff1b;支…

使用vue快速开发一个带弹窗的Chrome插件

vue-chrome-extension-quickstart 说在前面 &#x1f388;平时我们使用Chrome插件通常都只是用来编写简单的js注入脚本&#xff0c;大家有没有遇到过需要插件在页面上注入一个弹窗呢&#xff1f;比如我们希望可以通过快捷键快速唤起ChatGPT面板或者快速唤起一个翻译面板&#x…

使用 Jaxb xml转JavaBean

1、什么是JAXB JAXB&#xff08;Java Architecture for XML Binding) 是一个业界的标准&#xff0c;是用于 XML 绑定的 Java 体系结构&#xff08;JAXB&#xff09;是允许将 Java 类映射到 XML 表示形式的软件框架。 JAXB 支持将 Java 对象编组为 XML&#xff0c;然后将 XML 解…

自动化革命:大象机器人的Mercury A1机械臂

引言 大象机器人的Mercury系列&#xff0c;是面向工业自动化和智能制造的新型机械臂产品线。这些机械臂不仅在设计上创新&#xff0c;还在材料选择上使用了碳纤维、铝合金和工程塑料等轻质强韧材料&#xff0c;搭载高精度谐波减速器。Mercury系列的推出&#xff0c;反映了大象机…

day2:TCP、UDP网络通信模型

思维导图 机械臂实现 #include <head.h> #define SER_POTR 8899 #define SER_IP "192.168.125.223" int main(int argc, const char *argv[]) {//创建套接字int cfdsocket(AF_INET,SOCK_STREAM,0);if(cfd-1){perror("");return -1;}//链接struct so…

部署MinIO

一、安装部署MINIO 1.1 下载 wget https://dl.min.io/server/minio/release/linux-arm64/minio chmod x minio mv minio /usr/local/bin/ # 控制台启动可参考如下命令, 守护进程启动请看下一个代码块 # ./minio server /data /data --console-address ":9001"1.2 配…

JavaWeb,JavaScript的学习(下)

事件 事件可以是浏览器行为&#xff0c;也可以是用户行为。当这些行为发生时&#xff0c;可以自动触发对应的JS函数的运行&#xff0c;称之为事件发生。JS的事件驱动指的就是行为触发代码运行的特点 常见事件 鼠标事件 onclick&#xff1a;当用户点击某个对象时调用的事件句…

fuckingAlgorithm【双指针】19.删除链表的倒数第N个结点

19. Remove Nth Node From End of List remove-nth-node-from-end-of-list 要寻找倒数k个节点&#xff0c; 从虚拟头节点0开始走&#xff0c;p1指针先走k步&#xff0c;到达第k个节点然后p2指针从虚拟节点0开始&#xff0c;和p1一起同步前进&#xff0c;直到p1走到末尾n1节点…

LeetCode——82. 删除排序链表中的重复元素II

通过万岁&#xff01;&#xff01;&#xff01; 题目&#xff1a;题目的大致意思就是&#xff0c;给你一个升序的链表&#xff0c;然后让你里面的元素有重复的&#xff0c;所有重复的元素都进行一个删除。思路&#xff1a;这个题的简化版是“83.删除排序链表中的重复元素”。看…

深度学习笔记(七)——基于Iris/MNIST数据集构建基础的分类网络算法实战

文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解&#xff0c;如有遗漏或错误&#xff0c;欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 认识网络的构建结构 在神经网络的构建过程中&#xff0c;都避不开以下几个步骤&#xff1a; 导入网络和依…