编程进阶网编程进阶网
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 基础组成体系
  • 程序编程原理
  • 异常和IO系统
  • 六大设计原则
  • 设计模式导读
  • 创建型设计模式
  • 结构型设计模式
  • 行为型设计模式
  • 设计模式案例
  • 面向对象思想
  • 基础入门
  • 高级进阶
  • JVM虚拟机
  • 数据集合
  • Java面试题
  • C语言入门
  • C综合案例
  • C标准库
  • C语言专栏
  • C++入门
  • C++综合案例
  • C++专栏
  • HTML
  • CSS
  • JavaScript
  • 前端专栏
  • Swift
  • iOS入门
  • 基础入门
  • 开源库解读
  • 性能优化
  • Framework
  • 方案设计
  • 媒体音视频
  • 硬件开发
  • Groovy
  • 常用工具
  • 大厂面试题
  • 综合案例
  • 网络底层
  • Https
  • 网络请求
  • 故障排查
  • 专栏
  • 数组
  • 链表
  • 栈
  • 队列
  • 树
  • 递归
  • 哈希
  • 排序
  • 查找
  • 字符串
  • 其他
  • Bash脚本
  • Linux入门
  • 嵌入式开发
  • 代码规范
  • Markdown
  • 开发理论
  • 开发工具
  • Git管理
  • 百宝箱
  • 开源协议
  • 技术招聘
  • 测试经验
  • 职场提升
  • 技术模版
  • 关于我
  • 目标清单
  • 学习框架
  • 育儿经验
  • 我的专栏
  • 底层能力
  • 读书心得
  • 随笔笔记
  • 职场思考
  • 中华历史
  • 经济学故事
  • 01.UIKit框架学习
  • 02.UIViewController
  • 03.iOS工程面板说明
  • 04.基础控件Swift版
  • 05.手势的处理逻辑
  • 06.通信设计和实践
  • 07.Swift数据的存储
  • 09.Swift版网络请求
  • 10.Swift版数据存储
  • 11.Swift版多媒体实践
  • 12.Swift与ObjC互调
  • 13.Swift多线程开发
  • 14.Swift版SnapKit布局
  • 16.开发SDK实践
  • 17.iOS项目经验积累
  • 18.Swift版grpc请求

07.Swift数据的存储

目录介绍

  • 01.存储简单数据类型
    • 1.1 UserDefaults介绍
    • 1.2 保存和读取数据
    • 1.3 检查数据是否存在
    • 1.4 如何删除数据
    • 1.5 使用场景需说明
    • 1.6 数据存储在哪里
  • 02.属性列表存储
    • 2.1 属性列表存储
    • 2.2 列表数据存储实践
  • 03.CoreData存储
    • 3.1 CoreData是什么
    • 3.2 CoreData核心组件
    • 3.3 CoreData实践步骤
    • 3.4 创建Core Data
    • 3.5 创建管理持久化对象
    • 3.6 增删改查数据处理
    • 3.7 数据处理高级功能
  • 04.SQLite数据存储
    • 4.1
  • 05.File文件存储
    • 5.1 文件存储是什么
    • 5.2 确定存储路径
    • 5.3 创建&删除文件
    • 5.4 将数据写入文件
    • 5.5 从文件读取数据
    • 5.6 存字典的数据
  • 06.iOS中沙盒结构
    • 6.1 应用沙盒结构分析

01.存储简单数据类型

1.1 UserDefaults介绍

UserDefaults 是一个用于存储和检索应用程序设置和用户偏好的接口。是一个轻量级的存储机制,适用于简单的数据存储需求。

它提供了一种简单的方式来保存和读取小量的数据,例如用户的偏好设置、应用程序的配置信息等。

1.2 保存和读取数据

UserDefaults:存储简单的数据类型,如字符串、数字和布尔值。

let defaults = UserDefaults.standard

//存储数据
defaults.set("John Doe", forKey: "username")
defaults.set(30, forKey: "age")
defaults.set(421125199303111234, forKey: "cardId")

//读取数据
let username = defaults.string(forKey: "username")
let age = defaults.string(forKey: "age")
let cardId = defaults.string(forKey: "cardId")

1.3 检查数据是否存在

使用 object(forKey:) 方法来检查特定键的数据是否存在。如果返回的值不为 nil,则表示数据存在。

if UserDefaults.standard.object(forKey: "username") != nil {
    // 数据存在
} else {
    // 数据不存在
}

1.4 如何删除数据

使用 removeObject(forKey:) 方法来删除特定键的数据。

UserDefaults.standard.removeObject(forKey: "username")
UserDefaults.standard.removeAll()

1.5 使用场景需说明

UserDefaults 适用于存储小量的数据,例如用户设置和偏好。对于大量或敏感的数据,应该使用其他适当的存储机制,例如数据库或文件系统。

1.6 数据存储在哪里

UserDefaults 使用了一个名为 "UserDefaults.plist" 的文件来保存数据。这个文件通常存储在应用程序的沙盒目录中的 Library/Preferences 文件夹下。

"UserDefaults.plist" 文件是一个二进制文件,您不能直接编辑它。您应该使用 UserDefaults 提供的 API 来读取和写入数据。

由于 "UserDefaults.plist" 文件存储在应用程序的沙盒目录中,它的数据是应用程序私有的,其他应用程序无法直接访问或修改它。

02.属性列表存储

2.1 属性列表存储

每次在Xcode中新建一个iOS项目后,都会自己产生一个.plist文件,里面记录项目的一些配置信息。我们也可以自己创建.plist文件来进行数据的存储和读取。

plist文件存储,存储目录:Documents

属性列表(plist):存储NSArray(数组)、NSDictionary(字典)、NSData、NSString(字符串)、NSNumber(数字)等对象。

一般可以使用属性列表文件存储 NSArray(数组) 或者 NSDictionary(字典) 之类的数据,这种 “属性列表文件” 的扩展名是 plist,因此也称为 “plist 文件”。

plist 是以 xml 文件形式存储的。

2.2 列表数据存储实践

let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = path.appendingPathComponent("data.plist")
let data = ["username": "John Doe", "email": "john@example.com"] as NSDictionary
data.write(toFile: filePath.path, atomically: true)
 
let readData = NSDictionary(contentsOfFile: filePath.path)

PList 数据存储:https://developer.aliyun.com/article/312144

03.CoreData存储

3.1 CoreData是什么

Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成数据,也能够将保存在数据库中的数据还原成对象。

Core Data数据最终的存储类型可以是:SQLite数据库,XML,二进制,内存里,或自定义数据类型。

3.2 CoreData核心组件

Core Data的主要组件

  1. 数据模型(Data Model):定义数据的存储结构。
  2. 托管对象上下文(Managed Object Context):协调数据的创建、查询、更新和删除。
  3. 托管对象(Managed Object):数据模型中的实体实例。
  4. 持久化存储协调器(Persistent Store Coordinator):管理数据的存储方式。
  5. 实体描述(Entity Description):定义实体的属性和关系。

3.3 CoreData实践步骤

使用Core Data进行数据存储的步骤

  1. 定义数据模型:使用Xcode创建数据模型文件(.xcdatamodeld),定义实体和属性。
  2. 设置托管对象上下文:在AppDelegate中配置托管对象上下文。
  3. 创建和查询数据:使用托管对象上下文创建和查询数据。
  4. 保存上下文:在数据修改后,保存托管对象上下文以更新数据库。

3.4 创建Core Data

创建一个数据模型文件来定义应用程序对象的结构,包括它们的对象类型、属性和关系。

在Xcode中创建一个新的数据模型文件,添加一个名为"User"的实体,包含两个属性:“userName”(字符串类型)和"password"(整数类型)。

3.5 创建管理持久化对象

在 AppDelegate 中创建 NSPersistentContainer

通过 UIApplication 的 shared 实例来获取 AppDelegate 中的上下文(Context)。上下文通常用于 Core Data 框架中的数据操作。

lazy var persistentContainer: NSPersistentContainer = {
    //名字和Model.xcdatamodeld一样
    let container = NSPersistentContainer(name: "Model")
    //本地持久化资源的加载
    container.loadPersistentStores { (storeDescription, error) in
        if let error = error as NSError? {
            //无法加载持久化存储,处理异常
            fatalError("Unresolved error \(error), \(error.userInfo)")
        }
    }
    return container
}()

var context: NSManagedObjectContext {
    return persistentContainer.viewContext
}

3.6 增删改查数据处理

插入(保存)数据操作

//创建User对象
let user = NSEntityDescription.insertNewObject(forEntityName: "User",
                                               into: context) as! User

//对象赋值
user.id = 1
user.userName = "hangge"
user.password = "1234"

//保存
do {
    try context.save()
    print("保存成功!")
} catch {
    fatalError("不能保存:\(error)")
}

查询数据操作

//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量

//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate

//查询操作
do {
    let fetchedObjects = try context.fetch(fetchRequest)

    //遍历查询的结果
    for info in fetchedObjects{
        print("id=\(info.id)")
        print("username=\(info.userName)")
        print("password=\(info.password)")
    }
}
catch {
    fatalError("不能保存:\(error)")
}

修改数据操作

//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量

//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate

//查询操作
do {
    let fetchedObjects = try context.fetch(fetchRequest)
    //遍历查询的结果
    for info in fetchedObjects{
        //修改密码
        info.password = "abcd"
        //重新保存
        try context.save()
    }
} catch {
    fatalError("不能保存:\(error)")
}

删除数据操作

//声明数据的请求
let fetchRequest = NSFetchRequest<User>(entityName:"User")
fetchRequest.fetchLimit = 10 //限定查询结果的数量
fetchRequest.fetchOffset = 0 //查询的偏移量

//设置查询条件
let predicate = NSPredicate(format: "id= '1' ", "")
fetchRequest.predicate = predicate

//查询操作
do {
    let fetchedObjects = try context.fetch(fetchRequest)

    //遍历查询的结果
    for info in fetchedObjects{
        //删除对象
        context.delete(info)
    }

    //重新保存-更新到数据库
    try! context.save()
}
catch {
    fatalError("不能保存:\(error)")
}

3.7 数据处理高级功能

Core Data 还提供了许多其他功能,例如数据关系、数据验证、数据迁移等。

05.File文件存储

5.1 文件存储是什么

文件操作 (NSFileManager):https://developer.apple.com/documentation/foundation/filemanager

5.2 确定存储路径

在Swift中,可以使用FileManager来获取文档目录的路径。我们通常将文件存储在应用的文档目录中,以便于进行读写操作。

// 获取应用的文档目录路径
let fileManager = FileManager.default
if let documentsDirectory = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first {
    print("Documents Directory: \(documentsDirectory)")
}
  1. FileManager.default:获取文件管理器的默认实例。
  2. urls(for:in:):获取指定目录的路径。在这里,我们获取文档目录。
  3. first:取返回结果的第一个路径。

5.3 创建&删除文件

接下来,我们需要创建一个文件并确定文件名。

// 创建文件名
let fileName = "example.txt"
let filePath = documentsDirectory.appendingPathComponent(fileName)

appendingPathComponent(_😃:将文件名附加到文档目录路径上,形成完整的文件路径。

5.4 将数据写入文件

有了文件路径,就可以开始写入数据了。在此示例中,我们将写入一些简单的文本。

// 要写入的数据
let dataToWrite = "Hello, Swift file storage!"

do {
    // 将数据写入文件
    try dataToWrite.write(to: filePath, atomically: true, encoding: .utf8)
    print("数据成功写入到文件:\(filePath)")
} catch {
    print("写入文件时发生错误:\(error)")
}
  • write(to:atomically:encoding:):将字符串写入指定路径的文件。
  • catch:捕获写入过程中可能发生的错误并进行处理。

5.5 从文件读取数据

do {
    // 从文件中读取数据
    let readData = try String(contentsOf: filePath, encoding: .utf8)
    print("读取的数据是:\(readData)")
} catch {
    print("读取文件时发生错误:\(error)")
}

String(contentsOf:encoding:):从指定路径读取数据并将其转换为字符串。

5.6 存字典的数据

let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first!
let filePath = path.appendingPathComponent("data.plist")
let data = ["username": "John Doe", "email": "john@example.com"] as NSDictionary
//写数据
data.write(toFile: filePath.path, atomically: true)
//读数据
let readData = NSDictionary(contentsOfFile: filePath.path)

NSDictionary(contentsOf:encoding:):从指定路径读取数据并将其转换为字典。

06.iOS中沙盒结构

6.1 应用沙盒结构分析

1、应用程序包:包含了所有的资源文件和可执行文件

2、Documents:保存应用运行时生成的需要持久化的数据

3、tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除。

4、Library/Cache:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不备份该目录。一般存放体积大、不需要备份的非重要数据

5、Library/Preference:保存应用的所有偏好设置,IOS的Settings应用会在该目录中查找应用的设置信息。

贡献者: yangchong211
上一篇
06.通信设计和实践
下一篇
09.Swift版网络请求