在介绍存储方案之前有必要说下沙盒机制,详见:iOS中的沙盒目录
数据持久化,其实就是将数据写入到硬盘的方式,使得APP重启之后可以继续使用之前保存的数据。在iOS开发中,提供了5种数据持久化方案:
- plist
- Preference
- NSKeyedArchiver
- SQLite 3
- CoreData
plist
plist是将一些特定的类通过xml文件转化的方式将数据存储到目录中,可以被序列化的类只有:
NSArray
NSDictionary
NSString
NSNumber
NSData
NSDate
1. 获取文件路径
let documentsDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
let plistName = "/user.plist"
2. 读取
func readPlist() -> AnyObject? {
return NSArray(contentsOfFile: documentsDir + plistName)
}
3.写入(存储)
// 存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写true。
func savePlist() {
let plist = NSArray(array: ["ABC", "EFG", "SSK"])
plist.write(toFile: documentsDir + plistName, atomically: true)
}
Preference
一般是用于存储用户的一些偏好设置和基本用户信息。比如用户的id,姓名,APP的字体大小等信息。偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。
1. 存储
UserDefaults.standard.set("19658325", forKey: "uid")
UserDefaults.standard.synchronize()
2. 读取
let uid = UserDefaults.standard.string(forKey: "uid")
NSKeyedArchiver
归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化存储。归档这种存储方式的缺点是没有preference速度快,优点是可以自定义数据模型。
1. 定义数据模型
class PersonModel: NSObject, NSCoding {
var avatar: UIImage?
var name: String?
// NSCoding协议声明了两个必须实现的方法,一个用于将对象编码到归档中另一个用于说明如何解档来获取新的对象。
required init(coder aDecoder: NSCoder) {
super.init()
avatar = aDecoder.decodeObject(forKey: "avatar") as? UIImage
name = aDecoder.decodeObject(forKey: "name") as? String
}
func encode(with aCoder: NSCoder) {
aCoder.encode(self.avatar, forKey: "avatar")
aCoder.encode(self.name, forKey: "name")
}
override init() {
}
}
2. 指定路径
// 文件扩展名可以任意指定
let path = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] + "/person.file"
3. 归档
func archive() {
let p = PersonModel()
p.name = "大米卡卡"
p.avatar = UIImage(named: "avatar")
NSKeyedArchiver.archiveRootObject(p, toFile: path)
}
4. 解档
func unarchive() {
if let p = NSKeyedUnarchiver.unarchiveObject(withFile: path) as? PersonModel {
avatarView.image = p.avatar
nameLabel.text = p.name
}
}
SQLite3
CoreData
CoreData本质上依然是使用SQLite存储机制,只是它不需要编写一行SQL代码。