iOS中的数据持久化的方式有哪些?

在iOS开发中,数据持久化是指将应用中的数据存储到本地,使得数据在应用关闭后仍然可以保留。数据持久化是移动应用开发中非常重要的一部分,它可以帮助我们保存用户的设置、缓存数据、本地化存储等。本文将介绍iOS中常用的数据持久化方式,并通过实际案例来演示它们的用法。

Image

1. 数据持久化方式概览

iOS中常用的数据持久化方式有以下几种:

  1. 属性列表(Property List,plist)

  2. 归档(Archiving)

  3. SQLite数据库

  4. Core Data

  5. User Defaults

  6. 文件存储(File Storage)

  7. Keychain

每种方式都适用于不同的场景和数据类型,接下来我们将详细介绍每种方式的使用方法和特点。

2. 属性列表(Property List,plist)

属性列表是一种轻量级的数据持久化方式,适用于保存简单的数据结构,例如NSDictionary、NSArray等。属性列表以plist文件的形式存储,可以存储的数据类型包括字符串、数字、日期、字典和数组等。

使用步骤:

  1. 将数据存储为NSDictionary或NSArray类型。

let data: [String: Any] = ["name": "John", "age": 30, "isVIP": true]

  1. 获取应用的沙盒路径,并拼接plist文件名。

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {

 return

}

let fileURL = documentsDirectory.appendingPathComponent("data.plist")

  1. 将数据写入plist文件。

(data as NSDictionary).write(to: fileURL, atomically: true)

  1. 从plist文件读取数据。

if let loadedData = NSDictionary(contentsOf: fileURL) as? [String: Any] {

 // 处理读取到的数据

}

代码示例:

// 存储数据

let data: [String: Any] = ["name": "John", "age": 30, "isVIP": true]

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {

 return

}

let fileURL = documentsDirectory.appendingPathComponent("data.plist")

(data as NSDictionary).write(to: fileURL, atomically: true)



// 读取数据

if let loadedData = NSDictionary(contentsOf: fileURL) as? [String: Any] {

 print(loadedData) // ["name": "John", "age": 30, "isVIP": 1]

}

3. 归档(Archiving)

归档是一种将对象转换为二进制数据,并将其存储到文件中的方式。它适用于保存自定义的对象或复杂的数据结构,例如自定义的数据模型。归档的优势在于可以保存多个对象及其层次结构,以及相关的属性和关联关系。

使用步骤:

  1. 让自定义的对象遵循Codable协议,实现编码和解码方法。

class Person: Codable {

 var name: String

 var age: Int

 

 init(name: String, age: Int) {

•    self.name = name

•    self.age = age

 }

 

 // 实现编码和解码方法

}

  1. 将对象转换为二进制数据并存储到文件中。

let person = Person(name: "John", age: 30)

let fileURL = // 获取文件URL

let data = try? JSONEncoder().encode(person)

try? data?.write(to: fileURL)

  1. 从文件中读取二进制数据并解码为对象。

let fileURL = // 获取文件URL

let data = try? Data(contentsOf: fileURL)

let person = try? JSONDecoder().decode(Person.self, from: data)

代码示例:

// 存储数据

class Person: Codable {

 var name: String

 var age: Int

 

 init(name: String, age: Int) {

•    self.name = name

•    self.age = age

 }

}



let person = Person(name: "John", age: 30)

let fileURL = // 获取文件URL

let data = try? JSONEncoder().encode(person)

try? data?.write(to: fileURL)



// 读取数据

let fileURL = // 获取文件URL

let data = try? Data(contentsOf: fileURL)

let person = try? JSONDecoder().decode(Person.self, from: data)

4. SQLite数据库

SQLite是一种轻量级的嵌入式数据库,适用于存储结构化的数据。iOS中可以通过FMDB等第三方库来方便地使用SQLite数据库。

使用步骤:

  1. 导入FMDB库。

import FMDB

  1. 打开数据库并创建表。

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let createTableSQL = "CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"

 try? database.executeUpdate(createTableSQL, values: nil)

 database.close()

}

  1. 插入数据。

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let insertSQL = "INSERT INTO person (name, age) VALUES (?, ?)"

 try? database.executeUpdate(insertSQL, values: ["John", 30])

 database.close()

}

  1. 查询数据。

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let querySQL = ```swift

let querySQL = "SELECT * FROM person"

let resultSet = try? database.executeQuery(querySQL, values: nil)

while resultSet?.next() == true {

 let name = resultSet?.string(forColumn: "name") ?? ""

 let age = resultSet?.int(forColumn: "age") ?? 0

 print("Name: \(name), Age: \(age)")

}

database.close()

代码示例:

// 导入FMDB库

import FMDB



// 打开数据库并创建表

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let createTableSQL = "CREATE TABLE IF NOT EXISTS person (id INTEGER PRIMARY KEY, name TEXT, age INTEGER)"

 try? database.executeUpdate(createTableSQL, values: nil)

 database.close()

}



// 插入数据

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let insertSQL = "INSERT INTO person (name, age) VALUES (?, ?)"

 try? database.executeUpdate(insertSQL, values: ["John", 30])

 database.close()

}



// 查询数据

let fileURL = // 获取数据库文件URL

let database = FMDatabase(url: fileURL)

if database.open() {

 let querySQL = "SELECT * FROM person"

 let resultSet = try? database.executeQuery(querySQL, values: nil)

 while resultSet?.next() == true {

•    let name = resultSet?.string(forColumn: "name") ?? ""

•    let age = resultSet?.int(forColumn: "age") ?? 0

•    print("Name: \(name), Age: \(age)")

 }

 database.close()

}

5. Core Data

Core Data是苹果提供的一种对象图管理框架,它提供了一种将对象模型与持久化存储进行映射的方式。使用Core Data可以轻松地管理应用中的数据模型,实现数据的增删改查。

使用步骤:

  1. 在Xcode中创建Core Data模型文件,并定义数据模型。

  1. 生成NSManagedObject子类。

  1. 插入数据。

let appDelegate = UIApplication.shared.delegate as! AppDelegate

let context = appDelegate.persistentContainer.viewContext



let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Person

person.name = "John"

person.age = 30



try? context.save()

  1. 查询数据。

let appDelegate = UIApplication.shared.delegate as! AppDelegate

let context = appDelegate.persistentContainer.viewContext



let fetchRequest = NSFetchRequest<Person>(entityName: "Person")

let persons = try? context.fetch(fetchRequest)



for person in persons ?? [] {

 print("Name: \(person.name ?? ""), Age: \(person.age)")

}

代码示例:

// 插入数据

let appDelegate = UIApplication.shared.delegate as! AppDelegate

let context = appDelegate.persistentContainer.viewContext



let person = NSEntityDescription.insertNewObject(forEntityName: "Person", into: context) as! Person

person.name = "John"

person.age = 30



try? context.save()



// 查询数据

let appDelegate = UIApplication.shared.delegate as! AppDelegate

let context = appDelegate.persistentContainer.viewContext



let fetchRequest = NSFetchRequest<Person>(entityName: "Person")

let persons = try? context.fetch(fetchRequest)



for person in persons ?? [] {

 print("Name: \(person.name ?? ""), Age: \(person.age)")

}

6. User Defaults

User Defaults是iOS提供的一种简单的数据持久化方式,适用于保存应用的配置信息和用户偏好设置。

使用步骤:

  1. 使用UserDefaults对象来存储和读取数据。

let userDefaults = UserDefaults.standard

userDefaults.set("John", forKey: "name")

userDefaults.set(30, forKey: "age")

userDefaults.synchronize()

  1. 读取数据。

let userDefaults = UserDefaults.standard

let name = userDefaults.string(forKey: "name") ?? ""

let age = userDefaults.integer(forKey: "age")

print("Name: \(name), Age: \(age)")

代码示例:

// 存储数据

let userDefaults = UserDefaults.standard

userDefaults.set("John", forKey: "name")

userDefaults.set(30, forKey: "age")

userDefaults.synchronize()



// 读取数据

let userDefaults = UserDefaults.standard

let name = userDefaults.string(forKey: "name") ?? ""

let age = userDefaults.integer(forKey: "age")

print("Name: \(name), Age: \(age)")

7. 文件存储(File Storage)

文件存储是一种将数据以文件的形式保存在沙盒目录下的方式,适用于存储大量的非结构化数据,例如图片、音频和视频等。

使用步骤:

  1. 获取文件在沙盒中的路径。

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {

 return

}

let fileURL = documentsDirectory.appendingPathComponent("data.txt")

  1. 将数据写入文件。

let data = "Hello, World!".data(using: .utf8)

try? data?.write(to: fileURL)

  1. 从文件中读取数据。

let data = try? Data(contentsOf: fileURL)

let content = String(data: data ?? Data(), encoding: .utf8) ?? ""

print(content) // "Hello, World!"

代码示例:

// 存储数据

guard let documentsDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first else {

 return

}

let fileURL = documentsDirectory.appendingPathComponent("data.txt")

let data = "Hello, World!".data(using: .utf8)

try? data?.write(to: fileURL)



// 读取数据

let data = try? Data(contentsOf: fileURL)

let content = String(data: data ?? Data(), encoding: .utf8) ?? ""

print(content) // "Hello, World!"

8. Keychain

Keychain是iOS提供的一种安全的数据存储方式,适用于保存敏感信息,例如密码、令牌和证书等。

使用步骤:

  1. 导入Security.framework库。

  1. 使用KeychainWrapper类存储和读取数据。

let keychain = KeychainWrapper.standard

keychain.set("password123", forKey: "password")

let password = keychain.string(forKey: "password") ?? ""

print("Password: \(password)")

代码示例:

// 导入Security.framework库```swift

import Security



// 使用KeychainWrapper类存储和读取数据

let keychain = KeychainWrapper.standard

keychain.set("password123", forKey: "password")

let password = keychain.string(forKey: "password") ?? ""

print("Password: \(password)")

总结

本文介绍了iOS中常用的数据持久化方式,包括属性列表、归档、SQLite数据库、Core Data、User Defaults、文件存储和Keychain。不同的数据持久化方式适用于不同的场景和数据类型,开发者可以根据具体的需求选择合适的方式来实现数据持久化功能。同时,数据持久化过程中要注意数据的安全性和完整性,避免出现数据丢失或泄露的情况。

通过本文的介绍和示例代码,相信读者对iOS中的数据持久化有了更深入的理解,能够更加灵活地运用不同的数据持久化方式来满足应用的需求,提升应用的性能和用户体验。在日常开发中,合理选择和使用数据持久化方式将有助于开发出高质量的iOS应用。祝愿读者在iOS开发的路上越走越远,不断精进,成为一名优秀的iOS程序员!

参考文献:

  1. Apple Developer Documentation: https://developer.apple.com/documentation/

  2. FMDB GitHub Repository: https://github.com/ccgus/fmdb

  3. KeychainSwift GitHub Repository: https://github.com/evgenyneu/keychain-swift

  4. iOS Data Storage Guidelines: https://developer.apple.com/icloud/documentation/data-storage/

注:本文所涉及的代码示例中可能存在简化或省略,读者在实际使用时需根据实际情况进行完善和调试。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值