swift数据持久化的方式
之前有一篇文章,是说沙盒文件读写的,但是不详细,这个详细的记录下
数据持久化的方式分为几种,
1.plist
//
// ViewController.swift
// 持久化数据-ns
//
// Created by admin on 16/1/19.
// Copyright © 2016年 jin. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
let filePath = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!)/data.plist"
override func viewDidLoad() {
super.viewDidLoad()
}
// 保存数据方法
@IBAction func saveData(sender: AnyObject) {
// 字串保存,NSString类型和这个保存方式一致
let string:String = "string"
_ = try? string.writeToFile(filePath, atomically: true, encoding: NSUTF8StringEncoding)
// 数组保存,NSArray类型才可以
let array:NSArray = [1,2,3]
array.writeToFile(filePath, atomically: true)
// 字典保存,NSDictionary才可以
let dictionary:NSDictionary = ["dic":"aaa"]
dictionary.writeToFile(filePath, atomically: true)
}
// 读取数据方法
@IBAction func readData(sender: AnyObject) {
let string:String! = try? String(contentsOfFile: filePath)
// 数组读取
let array = NSArray(contentsOfFile: filePath)
// 字典读取
let dictionary = NSDictionary(contentsOfFile: filePath)
print(dictionary)
}
}
2.系统偏好设置
//
// ViewController.swift
// 持久化数据-偏好设置
//
// Created by admin on 16/1/19.
// Copyright © 2016年 jin. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.saveData()
self.readData()
}
func saveData()
{
// 获得 NSUserDefaults 对象
let def = NSUserDefaults.standardUserDefaults()
// 设置值,还可以设置其它值,就不一一尝试了
def.setObject("test", forKey: "def")
// 设置值之后,并不是立即保存到文件的,这里需要保存下
def.synchronize()
}
func readData()
{
// 先获取对象
let def = NSUserDefaults.standardUserDefaults()
// 再获取值
print(def.objectForKey("def"))
}
}
3.NSCoding,自定以对象存储的时候注意实现协议的方法
//
// ViewController.swift
// 数据持久化-NSCoding
//
// Created by admin on 16/1/19.
// Copyright © 2016年 jin. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
let filePath = "\(NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true).last!)/data.plist"
override func viewDidLoad() {
super.viewDidLoad()
let arr:Array = [1,2,3]
// 遵循了NSCoding协议并实现了 编码方法和构造方法才能使用
// 写入,就不一一测试了
// NSKeyedArchiver.archiveRootObject(arr, toFile: filePath)
// 读取
// print(NSKeyedUnarchiver.unarchiveObjectWithFile(filePath))
// 自定义单个对象的读写
let dog = Dog(name: "dog")
// 写入
NSKeyedArchiver.archiveRootObject(dog, toFile: filePath)
// 读取
let encodeDog = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as! Dog
print(encodeDog.name)
// 存放多个对象到同一个文件中时使用 NSMutableData
// 写入
// 初始化多个对象
let dogA = Dog(name: "dogA")
let dogB = Dog(name: "dogB")
// 初始化 Data 对象
let dataEncoding = NSMutableData()
// 初始化 archiver 对象
let archiverEncoding = NSKeyedArchiver(forWritingWithMutableData: dataEncoding)
// 编码对象
archiverEncoding.encodeObject(dogA, forKey: "dogA")
archiverEncoding.encodeObject(dogB, forKey: "dogB")
// 结束编码
archiverEncoding.finishEncoding()
// 写入文件中
dataEncoding.writeToFile(filePath, atomically: true)
// 读取
// 从文件中初始化Data对象
let dataDecoding = NSMutableData(contentsOfFile: filePath)
// 初始化解码对象
let archiveDecoding = NSKeyedUnarchiver(forReadingWithData: dataDecoding!)
// 根据键值还原对象
let dogAencoding:Dog = archiveDecoding.decodeObjectForKey("dogA") as! Dog
archiveDecoding.finishDecoding()
print(dogAencoding.name)
}
}
// 自定义对象,注意腰继承的对象和遵守的协议
class Dog:NSObject,NSCoding {
var name:String
// 自定义的构造方法
@objc init(name:String)
{
self.name = name
}
// 协议的写入数据的方法
@objc func encodeWithCoder(aCoder: NSCoder) {
aCoder.encodeObject(self.name, forKey: "name")
}
// 协议的读取数据的方法
@objc required init?(coder aDecoder: NSCoder) {
self.name = aDecoder.decodeObjectForKey("name") as! String
// return nil
}
}