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
    }
}

标签: swift, ios数据持久化

添加新评论