使用plist文件存储信息
2015-07-17 17:06
525 查看
用户添加或更改的信息用内存来存储是不合适的,因为在用户切换到其他程序的时候可能因为内存不够的原因而关闭我们的程序。
程序关闭后那些信息就丢失了。
因此将信息存在某个地方 ,当程序启动的时候将信息导入,用户修改过后再将信息继续存储则是一种好的方式。
大量的数据由于性能的要求可以存入数据库中,少量的数据存在文件中就可以了。
而iOS则提供了plist这种文件形式来存储少量的信息。使用plist文件存储信息的步骤如下:
1. 在存储之前要先要找到存储文件的位置,参考To-do list项目的程序
2.实现数据的序列化和读写文件
由于使用的tableview,我的数据源是一个数组
将信息写入文件时需要进行编码
相反要以这个值为键取出数据
在对一个数组进行编码时,对数组中的每一个对象都要进行编码,此时这个类需要实现 NSCoding协议,包括类对象的编码和解码方式。
由于类具有text 和 checked属性,在对象进行编码时需要存储这两个属性,于是在下面的编码中分别以“Text”和“Checked”为键值进行存储
并且可以看出bool类型的方式和其他类型的方式不同。
3.在类对象的初始化函数中,进行数据的导入
在运行loadChecklistItems()函数后,items属性从文件中获得数据。
4.在任何更改信息的过程中运行saveChecklistItems()函数进行数据的保存。
更好的方法就是在程序将要悬挂或者将要结束的时候执行,进行数据的保存,可以将保存的函数写在APP delegate的相应函数中。
程序关闭后那些信息就丢失了。
因此将信息存在某个地方 ,当程序启动的时候将信息导入,用户修改过后再将信息继续存储则是一种好的方式。
大量的数据由于性能的要求可以存入数据库中,少量的数据存在文件中就可以了。
而iOS则提供了plist这种文件形式来存储少量的信息。使用plist文件存储信息的步骤如下:
1. 在存储之前要先要找到存储文件的位置,参考To-do list项目的程序
func documentsDirectory() -> String { let paths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true) as! [String] return paths[0] } func dataFilePath() -> String { return documentsDirectory().stringByAppendingPathComponent("Checklists.plist") }
2.实现数据的序列化和读写文件
由于使用的tableview,我的数据源是一个数组
var items: [ChecklistItem]
将信息写入文件时需要进行编码
func saveChecklistItems() { let data = NSMutableData() let archiver = NSKeyedArchiver(forWritingWithMutableData: data) archiver.encodeObject(items, forKey: "ChecklistItems") archiver.finishEncoding() data.writeToFile(dataFilePath(), atomically: true) }此过程将数组以键值为ChecklistItems进行编码,写入文件
相反要以这个值为键取出数据
func loadChecklistItems() { let path = dataFilePath() if NSFileManager.defaultManager().fileExistsAtPath(path) { if let data = NSData(contentsOfFile: path) { let unarchiver = NSKeyedUnarchiver(forReadingWithData: data) items = unarchiver.decodeObjectForKey("ChecklistItems") as! [ChecklistItem] unarchiver.finishDecoding() } } }
在对一个数组进行编码时,对数组中的每一个对象都要进行编码,此时这个类需要实现 NSCoding协议,包括类对象的编码和解码方式。
class ChecklistItem: NSObject, NSCoding { var text = "" var checked = false func toggleChecked() { checked = !checked } override init() { super.init() } required init(coder aDecoder: NSCoder) { text = aDecoder.decodeObjectForKey("Text") as! String checked = aDecoder.decodeBoolForKey("Checked") super.init() } func encodeWithCoder(aCoder: NSCoder) { aCoder.encodeObject(text, forKey: "Text") aCoder.encodeBool(checked, forKey: "Checked") } }
由于类具有text 和 checked属性,在对象进行编码时需要存储这两个属性,于是在下面的编码中分别以“Text”和“Checked”为键值进行存储
并且可以看出bool类型的方式和其他类型的方式不同。
3.在类对象的初始化函数中,进行数据的导入
var items: [ChecklistItem] required init(coder aDecoder: NSCoder) { items = [ChecklistItem]() super.init(coder: aDecoder) loadChecklistItems() }
在运行loadChecklistItems()函数后,items属性从文件中获得数据。
4.在任何更改信息的过程中运行saveChecklistItems()函数进行数据的保存。
更好的方法就是在程序将要悬挂或者将要结束的时候执行,进行数据的保存,可以将保存的函数写在APP delegate的相应函数中。
相关文章推荐
- 购物网站建设购物车设计的6个关键点
- jsp显示优酷视频
- 关于切换程序输入法变成全角。
- jquery实现table列合并
- Android清除本地数据缓存代码
- mysqlmysql_upgrade 报错
- Android通过构造函数传递数据
- 分布式系统的事务处理
- BZOJ 1022 [SHOI2008]小约翰的游戏John
- springMVC中使用POI方式导出excel至客户端、服务器实例
- 第一范式,第二范式,第三范式
- (转)IOC框架Ninject实践总结
- 详细解析Java中抽象类和接口的区别
- 测试使用cobbler服务
- Android4.4, extents PreferenceActivity, Runtime Exception 解决办法。
- cortex m0 lpc1114_GPIO引脚寄存器综述
- 正则表达式 验证日期合法性(包括匹配闰年)
- android 之加载图片(二)
- STM32学习笔记(二) 基于STM32-GPIO的流水灯实现
- UIViewContentMode各类型效果