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
}
七、选择建议
- 小量简单数据:UserDefaults
- 敏感信息:Keychain
- 结构化数据:
- 简单需求:SQLite/SQLite.swift
- 复杂需求:Core Data/Realm
- 大文件/自定义格式:FileManager
- 网络资源缓存:NSCache + 文件系统
- 对象持久化:Codable + 文件系统
八、性能与安全建议
- 主线程优化:避免在主线进行大量IO操作
- 数据加密:敏感数据应加密存储
- 缓存清理:定期清理过期缓存
- iCloud备份:合理配置
do not backup
属性 - 数据迁移:提前规划数据结构变更方案
每种存储方案都有其适用场景,实际开发中通常会组合使用多种方案。例如,使用Core Data管理主要业务数据,Keychain存储认证令牌,UserDefaults保存用户偏好设置,FileManager处理文件下载缓存。