iOS第十一篇 iOS项目本地存储方案大全

iOS项目本地存储方案大全

iOS开发中有多种本地数据存储方案,每种方案都有其适用场景和特点。以下是iOS项目中常用的本地存储方法:

一、基础存储方案

1. UserDefaults (NSUserDefaults)

  • 特点:轻量级键值存储
  • 适用场景:存储用户偏好设置、小量简单数据
  • 存储位置:沙盒的Preferences目录
  • 代码示例
// 存储数据
UserDefaults.standard.set("value", forKey: "key")
UserDefaults.standard.synchronize() // iOS 12+不需要显式调用

// 读取数据
let value = UserDefaults.standard.string(forKey: "key")

2. Plist文件

  • 特点:XML格式的属性列表
  • 适用场景:结构化配置数据
  • 存储位置:沙盒Documents或Library目录
  • 代码示例
// 写入
let dict = ["key": "value"] as NSDictionary
dict.write(toFile: path, atomically: true)

// 读取
if let dict = NSDictionary(contentsOfFile: path) {
    print(dict)
}

二、文件存储方案

3. 文件系统(FileManager)

  • 特点:直接操作文件和目录

  • 适用场景:大文件、自定义格式数据

  • 存储位置:沙盒各目录

  • 沙盒目录

    • Documents:用户数据,iTunes备份
    • Library/Caches:缓存文件,不备份
    • Library/Application Support:持久化数据,备份
    • tmp:临时文件,系统可能清理
  • 代码示例

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

// 写入
try? "content".write(to: fileURL, atomically: true, encoding: .utf8)

// 读取
let content = try? String(contentsOf: fileURL, encoding: .utf8)

三、数据库方案

4. SQLite

  • 特点:轻量级关系型数据库

  • 适用场景:结构化数据、复杂查询

  • 常用库

    • 原生SQLite3 C API
    • FMDB (Objective-C封装)
    • SQLite.swift (Swift封装)
  • SQLite.swift示例

import SQLite

let db = try Connection("path/to/db.sqlite3")
let users = Table("users")
let id = Expression<Int64>("id")
let name = Expression<String>("name")

// 创建表
try db.run(users.create { t in
    t.column(id, primaryKey: true)
    t.column(name)
})

// 插入
try db.run(users.insert(name <- "Alice"))

// 查询
for user in try db.prepare(users) {
    print("id: \(user[id]), name: \(user[name])")
}

5. Core Data

  • 特点:苹果官方ORM框架
  • 适用场景:复杂对象图管理
  • 优势:内存管理、数据模型版本迁移
  • 代码示例
// 1. 创建NSManagedObject子类
class User: NSManagedObject {
    @NSManaged var id: Int64
    @NSManaged var name: String?
}

// 2. 操作数据
let context = persistentContainer.viewContext
let user = User(context: context)
user.id = 1
user.name = "Bob"

do {
    try context.save()
} catch {
    print("保存失败: \(error)")
}

// 3. 查询
let request: NSFetchRequest<User> = User.fetchRequest()
let users = try context.fetch(request)

6. Realm

  • 特点:高性能移动数据库
  • 适用场景:替代SQLite/Core Data
  • 优势:跨平台、实时更新、易用API
  • 代码示例
import RealmSwift

class User: Object {
    @Persisted(primaryKey: true) var id: Int
    @Persisted var name: String
}

// 写入
let realm = try! Realm()
try! realm.write {
    let user = User()
    user.id = 1
    user.name = "Charlie"
    realm.add(user)
}

// 查询
let users = realm.objects(User.self)
print(users)

四、键值存储方案

7. Keychain(钥匙串)

  • 特点:安全存储敏感信息
  • 适用场景:密码、令牌等安全数据
  • 存储位置:系统级加密存储
  • 代码示例(使用KeychainAccess库):
import KeychainAccess

let keychain = Keychain(service: "com.your.app")
keychain["token"] = "secret_token"  // 存储
let token = keychain["token"]      // 读取

五、归档存储方案

8. NSCoding/NSKeyedArchiver

  • 特点:对象序列化/反序列化
  • 适用场景:自定义对象持久化
  • 代码示例
class User: NSObject, NSCoding {
    var name: String
    
    init(name: String) {
        self.name = name
    }
    
    required init?(coder: NSCoder) {
        name = coder.decodeObject(forKey: "name") as? String ?? ""
    }
    
    func encode(with coder: NSCoder) {
        coder.encode(name, forKey: "name")
    }
}

// 归档
let user = User(name: "David")
let data = try NSKeyedArchiver.archivedData(withRootObject: user, requiringSecureCoding: false)
try data.write(to: fileURL)

// 解档
let loadedData = try Data(contentsOf: fileURL)
if let loadedUser = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(loadedData) as? User {
    print(loadedUser.name)
}

9. Codable协议

  • 特点:Swift原生编解码
  • 适用场景:JSON与模型转换
  • 代码示例
struct User: Codable {
    var id: Int
    var name: String
}

// 编码
let user = User(id: 1, name: "Eve")
let encoder = JSONEncoder()
if let data = try? encoder.encode(user) {
    try? data.write(to: fileURL)
}

// 解码
if let data = try? Data(contentsOf: fileURL),
   let decodedUser = try? JSONDecoder().decode(User.self, from: data) {
    print(decodedUser)
}

六、缓存专用方案

10. NSCache

  • 特点:内存缓存,自动清理
  • 适用场景:临时缓存图片等资源
  • 代码示例
let cache = NSCache<NSString, UIImage>()
cache.setObject(image, forKey: "avatar")
if let cachedImage = cache.object(forKey: "avatar") {
    imageView.image = cachedImage
}

七、选择建议

  1. 小量简单数据:UserDefaults
  2. 敏感信息:Keychain
  3. 结构化数据
    • 简单需求:SQLite/SQLite.swift
    • 复杂需求:Core Data/Realm
  4. 大文件/自定义格式:FileManager
  5. 网络资源缓存:NSCache + 文件系统
  6. 对象持久化:Codable + 文件系统

八、性能与安全建议

  1. 主线程优化:避免在主线进行大量IO操作
  2. 数据加密:敏感数据应加密存储
  3. 缓存清理:定期清理过期缓存
  4. iCloud备份:合理配置do not backup属性
  5. 数据迁移:提前规划数据结构变更方案

每种存储方案都有其适用场景,实际开发中通常会组合使用多种方案。例如,使用Core Data管理主要业务数据,Keychain存储认证令牌,UserDefaults保存用户偏好设置,FileManager处理文件下载缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HiHi_Peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值