iOS开发——数据持久化&本地数据的存储(使用NSCoder将对象保存到.plist文件)

 本地数据的存储(使用NSCoder将对象保存到.plist文件)

下面通过一个例子将联系人数据保存到沙盒的“documents”目录中。(联系人是一个数组集合,内部为自定义对象)。
 
功能如下:
  • 1,点击“保存”将联系人存入userList.plist文件中
  • 2,点击“读取”从数据文件中加载解析出联系人
 
注意:
  • 1,本例使用了NSCoder,这个封装了许多技术细节,使用它我们可以很轻易的将对象写到文件中,也可以用它将文件中的对象转换回来。
  • 2,自定义对象必须添加如下两个方法,这个才能顺利的被序列化编码存储和读取。
 1 //从nsobject解析回来
 2 init(coder aDecoder:NSCoder!){
 3     self.name=aDecoder.decodeObjectForKey("Name") as String
 4     self.phone=aDecoder.decodeObjectForKey("Phone") as String
 5 }
 6  
 7 //编码成object
 8 func encodeWithCoder(aCoder:NSCoder!){
 9     aCoder.encodeObject(name,forKey:"Name")
10     aCoder.encodeObject(phone,forKey:"Phone")
11 }

 

 
具体代码如下:
--- ViewController.swift ---
 1 import UIKit
 2  
 3 class ViewController: UIViewController {
 4  
 5     var dataModel = DataModel()
 6  
 7     override func viewDidLoad() {
 8         super.viewDidLoad()
 9         // Do any additional setup after loading the view, typically from a nib.
10          
11         //初始化模拟数据
12         onCreateData()
13     }
14      
15     //创建模拟数据
16     func onCreateData(){
17         dataModel.userList.append(UserInfo(name: "张三", phone: "1234"))
18         dataModel.userList.append(UserInfo(name: "李四", phone: "1212"))
19         dataModel.userList.append(UserInfo(name: "航歌", phone: "3525"))
20     }
21  
22     //保存数据
23     @IBAction func saveData(sender:AnyObject) {
24         dataModel.saveData()
25     }
26      
27     //读取数据
28     @IBAction func loadData(sender:AnyObject) {
29         dataModel.loadData()
30     }
31      
32     override func didReceiveMemoryWarning() {
33         super.didReceiveMemoryWarning()
34         // Dispose of any resources that can be recreated.
35     }
36 }

 


--- DataModel.swift ---
 1 import UIKit
 2  
 3 class DataModel: NSObject {
 4      
 5     var userList = [UserInfo]()
 6      
 7     override init(){
 8         super.init()
 9         println("沙盒文件夹路径:\(documentsDirectory())")
10         println("数据文件路径:\(dataFilePath())")
11     }
12      
13     //保存数据
14     func saveData() {
15         var data = NSMutableData()
16         //申明一个归档处理对象
17         var archiver = NSKeyedArchiver(forWritingWithMutableData: data)
18         //将lists以对应Checklist关键字进行编码
19         archiver.encodeObject(userList, forKey: "userList")
20         //编码结束
21         archiver.finishEncoding()
22         //数据写入
23         data.writeToFile(dataFilePath(), atomically: true)
24     }
25      
26     //读取数据
27     func loadData() {
28         //获取本地数据文件地址
29         let path = self.dataFilePath()
30         //声明文件管理器
31         let defaultManager = NSFileManager()
32         //通过文件地址判断数据文件是否存在
33         if defaultManager.fileExistsAtPath(path) {
34             //读取文件数据
35             let data = NSData(contentsOfFile: path)
36             //解码器
37             let unarchiver = NSKeyedUnarchiver(forReadingWithData: data!)
38             //通过归档时设置的关键字Checklist还原lists
39             userList = unarchiver.decodeObjectForKey("userList") as Array
40             //结束解码
41             unarchiver.finishDecoding()
42         }
43     }
44      
45     //获取沙盒文件夹路径
46     func documentsDirectory()->String {
47         var paths = NSSearchPathForDirectoriesInDomains(
48             NSSearchPathDirectory.DocumentationDirectory,NSSearchPathDomainMask.UserDomainMask,true)
49         var documentsDirectory:String = paths.first as String
50         return documentsDirectory
51     }
52      
53     //获取数据文件地址
54     func dataFilePath ()->String{
55         return self.documentsDirectory().stringByAppendingString("userList.plist")
56     }
57 }

 


--- UserInfo.swift ---
 1 import UIKit
 2  
 3 class UserInfo: NSObject {
 4     var name:String
 5     var phone:String
 6      
 7     //构造方法
 8     init(name:String="",phone:String=""){
 9         self.name = name
10         self.phone = phone
11         super.init()
12     }
13      
14     //从nsobject解析回来
15     init(coder aDecoder:NSCoder!){
16         self.name=aDecoder.decodeObjectForKey("Name") as! String
17         self.phone=aDecoder.decodeObjectForKey("Phone") as! String
18     }
19      
20     //编码成object
21     func encodeWithCoder(aCoder:NSCoder!){
22         aCoder.encodeObject(name,forKey:"Name")
23         aCoder.encodeObject(phone,forKey:"Phone")
24     }
25 }

 

你可能感兴趣的:(ios开发)