Day18-数据持久化方案

YVTU

iOS 的数据持久化是指将应用运行过程中产生的数据保存到设备的本地存储中,以便下次启动或在需要时读取。根据数据的结构复杂度、读写频率、安全性要求等不同场景,iOS 提供了多种持久化方案:


常见的数据持久化方式

1. NSUserDefaults / UserDefaults

  • 适用场景:轻量级数据,如设置项、登录状态、首选项。
  • 存储类型:基本类型(StringBoolIntFloatDouble)、数组、字典、Data
  • 存储位置Library/Preferences 目录下的 plist 文件。
  • 优点:简单易用,自动持久化。
  • 缺点:不适合存储大量或结构复杂的数据。
1
2
UserDefaults.standard.set(true, forKey: "hasLaunchedBefore")
let launched = UserDefaults.standard.bool(forKey: "hasLaunchedBefore")

2. Keychain

  • 适用场景:存储敏感信息,如密码、token。
  • 安全性高:系统级别的加密存储,支持 Touch ID / Face ID。
  • 缺点:API 较复杂,可通过第三方库简化如 KeychainAccessSAMKeychain
1
2
3
let keychain = Keychain(service: "com.example.app")
try? keychain.set("secret-token", key: "authToken")
let token = try? keychain.get("authToken")

3. File System

  • 适用场景:音视频、图片、文本文件、自定义数据模型的二进制形式。
  • 常用 APIFileManager
  • 文件位置
    • Documents:用户生成内容,iCloud 会备份
    • Caches:缓存数据,系统可能清理
    • tmp:临时数据,随时会被删除
1
2
let fileURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0].appendingPathComponent("myData.txt")
try? "Hello".write(to: fileURL, atomically: true, encoding: .utf8)

4. Core Data

  • 适用场景:结构化复杂数据的本地数据库存储。
  • 优点
    • Apple 官方支持的对象图管理框架
    • 支持数据模型、关系型建模、查询优化、懒加载等
    • 可结合 iCloud 使用
  • 缺点:学习曲线较陡,不适合简单数据
1
2
3
let entity = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context)
entity.setValue("Tom", forKey: "name")
try? context.save()

5. SQLite

  • 适用场景:对数据库结构完全控制;数据量大、结构清晰。
  • 优点:灵活、高性能、广泛应用
  • 缺点:原生 C 接口复杂,推荐使用封装库,如:
    • FMDB(Objective-C 封装)
    • GRDB.swift(Swift 封装)
1
2
import SQLite3
// 略:打开数据库、准备语句、执行语句等

6. Realm

  • 适用场景:替代 Core Data 或 SQLite,简单易用、性能优。
  • 优点
    • 不需要 schema migration 写 SQL
    • 跨平台
    • 响应式数据监听支持
  • 缺点:是第三方库,需集成维护
1
2
3
4
5
6
7
8
9
class Dog: Object {
@Persisted var name = ""
@Persisted var age = 0
}
let dog = Dog()
dog.name = "Rex"
try! realm.write {
realm.add(dog)
}

7. Codable + File System

  • 适用场景:中等复杂的数据模型,自定义结构序列化为 JSON/Plist/Binary
  • 优点:轻量、灵活。
  • 配合方式
    • JSONEncoder/Decoder
    • PropertyListEncoder/Decoder
1
2
3
4
5
6
7
struct User: Codable {
let name: String
let age: Int
}
let user = User(name: "Alice", age: 25)
let data = try JSONEncoder().encode(user)
try data.write(to: fileURL)

总结对比

方案 优点 缺点 适用场景
UserDefaults 简单易用 不适合复杂/大量数据 配置、轻量状态
Keychain 高安全性 API复杂 密码、token
File System 灵活、支持任意数据 手动管理读写/序列化 文件、缓存、二进制资源
Core Data 强大对象关系管理 学习成本高 中大型结构化数据
SQLite 精细控制、高性能 C语言繁琐 数据库开发、性能敏感场景
Realm 简洁高效 第三方库依赖 快速开发结构化数据存储
Codable + File 灵活易于维护 无查询机制 自定义模型、轻量数据库替代品