持久化存储方式有哪些?

UserDefaults

用途:存储轻量级的用户配置或设置(如用户偏好、应用设置)。
特点:
基于键值对(Key-Value)存储。
适合存储少量数据(如布尔值、字符串、数字等)。
数据存储在 plist 文件中。
示例:

// 存储数据
UserDefaults.standard.set("value", forKey: "key")
// 读取数据
let value = UserDefaults.standard.string(forKey: "key")
文件系统

用途:存储文件或自定义数据(如图片、音频、文本文件等)。
特点:
可以使用 FileManager 类来管理文件和目录。
数据存储在应用的沙盒目录中(如 Documents、Library、Caches 等)。
示例:

let fileManager = FileManager.default
let documentsURL = fileManager.urls(for: .documentDirectory, in: .userDomainMask).first!
let fileURL = documentsURL.appendingPathComponent("example.txt")

// 写入文件
let data = "Hello, World!".data(using: .utf8)
try? data?.write(to: fileURL)

// 读取文件
if let data = try? Data(contentsOf: fileURL) {
    let text = String(data: data, encoding: .utf8)
    print(text ?? "")
}
SQLite

用途:直接操作 SQLite 数据库。
特点:
轻量级的关系型数据库。
适合需要复杂查询和大量数据的场景。
需要使用 SQL 语句进行操作。
示例:

import SQLite3

var db: OpaquePointer?
let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("database.sqlite")

// 打开数据库
if sqlite3_open(fileURL.path, &db) == SQLITE_OK {
    let createTableQuery = "CREATE TABLE IF NOT EXISTS Users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT)"
    sqlite3_exec(db, createTableQuery, nil, nil, nil)
}
Keychain

用途:存储敏感数据(如密码、令牌、加密密钥)。
特点:
数据加密存储,安全性高。
即使应用被删除,数据也不会丢失。
示例:

import Security

let service = "com.yourapp"
let account = "user"
let password = "secret".data(using: .utf8)!

// 存储数据
let query: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: service,
    kSecAttrAccount as String: account,
    kSecValueData as String: password
]
SecItemAdd(query as CFDictionary, nil)

// 读取数据
let searchQuery: [String: Any] = [
    kSecClass as String: kSecClassGenericPassword,
    kSecAttrService as String: service,
    kSecAttrAccount as String: account,
    kSecReturnData as String: kCFBooleanTrue!,
    kSecMatchLimit as String: kSecMatchLimitOne
]
var item: CFTypeRef?
SecItemCopyMatching(searchQuery as CFDictionary, &item)
if let data = item as? Data {
    let password = String(data: data, encoding: .utf8)
    print(password ?? "")
}
Realm

用途:替代 Core Data 和 SQLite 的第三方数据库。
特点:
简单易用,性能优异。
支持对象存储和实时更新。
示例:

import RealmSwift

class User: Object {
    @objc dynamic var name = ""
}

let realm = try! Realm()
let user = User()
user.name = "John"

// 存储数据
try! realm.write {
    realm.add(user)
}

// 查询数据
let users = realm.objects(User.self)
print(users)
NSCoding / Codable

用途:将自定义对象序列化为文件存储。
特点:
NSCoding 是 Objective-C 的协议,Codable 是 Swift 的协议。
适合存储自定义对象。
示例(使用 Codable):

struct User: Codable {
    let name: String
}

let user = User(name: "John")
let encoder = JSONEncoder()
if let data = try? encoder.encode(user) {
    UserDefaults.standard.set(data, forKey: "user")
}

if let data = UserDefaults.standard.data(forKey: "user") {
    let decoder = JSONDecoder()
    if let user = try? decoder.decode(User.self, from: data) {
        print(user.name)
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容