iOS 数据持久化

  • 沙盒目录

数据持久化的方案有哪些?请举例分析

以下是 iOS 数据持久化的核心方案及回答策略,结合具体案例说明:

一、轻量级存储方案

  1. NSUserDefaults

    • 特点:键值对存储,​==少量配置数据(如用户偏好设置)==。

    • 案例:存储用户登录状态和主题颜色。

      // 存储 UserDefaults.standard.set(true, forKey: "isLoggedIn") UserDefaults.standard.set("dark", forKey: "themeColor") // 读取 let isLoggedIn = UserDefaults.standard.bool(forKey: "isLoggedIn") let theme = UserDefaults.standard.string(forKey: "themeColor")
    • 注意:数据存储在沙盒目录的==​Library/Preferences​==​目录,iTunes 同步时会备份。

  2. 属性列表(Plist)

    • 特点:==XML 格式存储数组、字典等结构化数据==。

    • 案例:保存应用的静态配置信息(如城市列表)。

      // 存储 let cities = ["北京", "上海", "广州"] let path = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0](@ref).appendingPathComponent("cities.plist") (cities as NSArray).write(to: path, atomically: true) // 读取 let loadedCities = NSArray(contentsOf: path) as? [String]
    • 限制:==仅支持基础数据类型(NSString、NSNumber 等)。==

二、对象级存储方案

  1. 归档(NSKeyedArchiver)

    • 特点:====​==化自定义对象为二进制数据。==

    • 案例:保存用户个人资料对象。

      // 自定义类需实现NSCoding协议 class UserProfile: NSObject, NSCoding { var name: String var age: Int func encode(with coder: NSCoder) { coder.encode(name, forKey: "name") coder.encode(age, forKey: "age") } required init?(coder: NSCoder) { name = coder.decodeObject(forKey: "name") as? String ?? "" age = coder.decodeInteger(forKey: "age") } } // 存储 let profile = UserProfile() let data = try NSKeyedArchiver.archivedData(withRootObject: profile, requiringSecureCoding: false) try data.write(to: filePath)

三、数据库方案

  1. SQLite

    • 特点:==轻量级关系型数据库,支持复杂查询==。

    • 案例:聊天记录的存储与分页查询。

      // 使用FMDB第三方库 let db = FMDatabase(path: "chat.db") db.open() db.executeUpdate("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY, content TEXT)", withArgumentsIn: []) db.executeUpdate("INSERT INTO messages (content) VALUES (?)", withArgumentsIn: ["Hello!"]) let rs = try db.executeQuery("SELECT * FROM messages", values: nil) while rs.next() { print(rs.string(forColumn: "content")) }
    • 优势:==高性能==、==低内存占用==,适合数据量大的场景。

  2. Core Data

    • 特点:苹果官方==ORM==框架,==支持对象图管理==。

    • 案例:电商应用的商品分类管理。

      // 定义Entity let context = persistentContainer.viewContext let product = Product(context: context) product.name = "iPhone 15" product.price = 6999 // 查询 let request: NSFetchRequest<Product> = Product.fetchRequest() request.predicate = NSPredicate(format: "price > %@", "5000") let results = try context.fetch(request)
    • 适用场景:需要==数据关系管理的复杂业务==(如社交网络好友关系)。

四、扩展方案

  1. 文件系统

    • 目录选择

      • Documents:==重要数据(如用户文档),iTunes 备份==
      • Caches:==临时缓存(如图片缩略图),系统可能自动清理==
    • 案例:保存用户下载的 PDF 文件。

      let pdfData = Data(...) // 网络下载的数据 let pdfPath = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0](@ref).appendingPathComponent("report.pdf") try pdfData.write(to: pdfPath)
  2. iCloud 同步

    • 特点:==跨设备数据同步,需配置 Capability==。

    • 案例:笔记应用的跨设备同步。

      let ubiquityURL = FileManager.default.url(forUbiquityContainerIdentifier: nil) let cloudDoc = ubiquityURL?.appendingPathComponent("Documents/note.txt") try "重要内容".write(to: cloudDoc!, atomically: true, encoding: .utf8)

  • iOS

    iOS 是由苹果公司开发的移动操作系统,最早于 2007 年 1 月 9 日的 Macworld 大会上公布这个系统,最初是设计给 iPhone 使用的,后来陆续套用到 iPod touch、iPad 以及 Apple TV 等产品上。iOS 与苹果的 Mac OS X 操作系统一样,属于类 Unix 的商业操作系统。

    88 引用 • 139 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...