iOS数据持久化方式可分为三种:如下图
归档存储 NSKeyedArchiver
对象要实现NSCoding协议,归档 encode,解档 decode
归档和解档都需要加载整个文件
①对已有类型归档和解档
方式一 :一次只能归档一个对象
//归档数据
func archiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
//归档
let array = ["德玛西亚", "猴哥"]
if NSKeyedArchiver.archiveRootObject(array, toFile: filePath) {
print("Archive Success")
}
}
//解档数据
func unarchiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
//解档
let data = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! NSArray
print(data)
}
方式二 :一次存储多个对象
/*
🍎NSData 和它子类 NSMutableData 是字节缓冲区的对象化封装
这个两个类通常在数据存储时候用的
NSMutableData 是动态数据对象。
即我们可以先创建个空的对象实例,在对象有效范围内增加、删除数据内容
*/
//归档数据
func archiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
///归档
let data = NSMutableData() //*🍎
let archiver = NSKeyedArchiver(forWritingWithMutableData: data)
//归档对象
archiver.encodeObject("LOL", forKey: "game")
archiver.encodeObject(["小炮", "卡牌"], forKey: "name")
archiver.encodeInt(5, forKey: "age")
archiver.finishEncoding() //完成归档
data.writeToFile(filePath, atomically: true) //写入文件
}
//解档数据
func unarchiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
///解档
let unarchiveData = NSData(contentsOfFile: filePath)
let unarchiver = NSKeyedUnarchiver(forReadingWithData: unarchiveData!)
//解档对象
let decodeStr = unarchiver.decodeObjectForKey("game") as! String
let decodeArr = unarchiver.decodeObjectForKey("name") as! NSArray
let decodeInt = unarchiver.decodeIntForKey("age")
print("\(decodeStr) \(decodeArr) \(decodeInt)")
}
②自定义类型归档和解档
必须实现 NSCoding 协议
class CustomDataModel: NSObject, NSCoding {
var numberArr: NSArray!
var name: String!
//归档
func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.numberArr, forKey: "numberArr")
aCoder.encodeObject(self.name, forKey: "name")
}
required init?(coder aDecoder: NSCoder) {
super.init()
//解档
self.numberArr = aDecoder.decodeObjectForKey("numberArr") as! NSArray
self.name = aDecoder.decodeObjectForKey("name") as! String
}
override init() {
}
}
-使用
//归档数据
func archiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
///归档
let yourData = CustomDataModel()
yourData.numberArr = [1,2,3]
yourData.name = "盖伦"
if NSKeyedArchiver.archiveRootObject(yourData, toFile: filePath) {
print("Archive Success")
}
}
//解档数据
func unarchiveData() {
//获取文件路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
let filePath = path.stringByAppendingString("/data.archive")
///解档
let unarchiveData = NSData(contentsOfFile: filePath) //*🍎
let decodeData = NSKeyedUnarchiver.unarchiveObjectWithData(unarchiveData!)
print(decodeData?.numberArr)
print(decodeData?.name)
}
属性列表
NSUserDefaults、 plist
① NSUserDefaults
注意:必须保证每一个Key的唯一性,相同的key会被覆盖
/*
支持的数据类型有NSString、 NSNumber、NSDate、 NSArray、
NSDictionary、BOOL、NSInteger、NSFloat等系统定义的数据类型
如果要存放自定义的对象,可将其转换成 NSData 进行存储
*/
//存储
func saveNSUserDefaults() {
let defults = NSUserDefaults.standardUserDefaults()
defults.setObject("汗血宝马", forKey: "name") //存储数据
defults.synchronize() //同步数据
}
//读取
func readNSUserDefaults() {
let defults = NSUserDefaults.standardUserDefaults()
let name = defults.objectForKey("name") as! String//取出数据
print(name)
}
② plist
//存储
func savePlistFile() {
//获取Document路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
//获取文件路径
let filePath = path.stringByAppendingString("/data.plist")
let data = NSMutableArray() //*🍎
//添加对象
data.addObject("兰博基尼")
data.addObject("法拉利")
data.addObject("布加迪威龙")
data.addObject("保时捷")
data.addObject("宝马")
//写入文件
data.writeToFile(filePath, atomically: true)
}
//读取
func readPlistFile() {
//获取Document路径
let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0]
//获取文件路径
let filePath = path.stringByAppendingString("/data.plist")
let data = NSArray(contentsOfFile: filePath)
print(data)
}
数据库
CoreData、SQLite、第三方库
多数据最好还是用数据库存储
CoreData 出门右转 官方文档 或度娘
SQLite 出门搜索引擎不送
第三方库 github 走起....
后续...