Swift使用NSKeyedArchiver进行数据持久化保存的经验

时间:2021-11-03 03:25:17

iOS提供了几种数据持久化保存的方法,有NSKeyedArchiver,Property List,NSUserDefaults和CoreData。我学习下来,觉得保存应用内的诸如列表,记录这些东西,用NSKeyedArchiver是比较合适的。

它有些类似于操作系统中将文件压缩存放,而它是将对象压缩成一个文件存放在iOS设备的硬盘中。这样的话即使将应用关闭,下次开启时也能使用方法从硬盘将数据解压缩出来,供用户继续操作这些数据。

让对象可被NSKeyedArchiver存储

如果想要使用NSKeyedArchiver保存系统预设类型的方法,那不用做什么额外的工作,直接调用方法保存即可。而如果要保存自己建立的类,则需要让类继承NSObject和协议NSCoding,并补上func encodeWithCoder(aCoder: NSCoder)required init?(coder aDecoder: NSCoder)两个对象。

例如,我们建立了一个对象Person,有String类型的name和Int类型的overall两个属性,那我们可以这么写上述两个方法来让它变得可以用NSKeyedArchiver保存:

func encodeWithCoder(aCoder: NSCoder){
aCoder.encodeObject(name, forKey: "name")
aCoder.encodeObject(overall, forKey: "overall")
} required init?(coder aDecoder: NSCoder) {
name = aDecoder.decodeObjectForKey("name") as! String
overall = aDecoder.decodeObjectForKey("overall") as! Int
}

保存

保存时需要输入路径和压缩文件名。但是实际上路径基本是固定的,因为其他位置几乎都是不可写的。文件名包括后缀都可以随意定义。

let filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/person.dat"

NSKeyedArchiver.archiveRootObject(person, toFile: filePath)

读取

读取时需要注意的是,读取出来的对象是作为NSObject类存在的,用户需要自行转为正确的类。

let filePath = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] + "/person.dat"

if let person : Person = NSKeyedUnarchiver.unarchiveObjectWithFile(filePath) as? Person{
//处理
}

我遇到的问题

其实抱怨这个问题就是这篇文章我主要目的。我之前做的demo在模拟器上运行毫无问题,但是插上手机在实机上测试,就保存失败了!搜索了半天资料,发现*上有个人与我遇到了同样的问题。后来经过调试,原来是我路径中没有加"/"。如果不加“/”,就变成了在应用主目录下生成一个Documentsperson.dat的文件,而不是在Documents文件夹下生成person.dat。在模拟器上,你是可以在任何文件夹下生成文件的,而实机上的权限控制就比较严格,Documentsperson.dat就会生成失败。

也是因为我选择的参考书并不靠谱(日本人藤田泰介所著的《プロの力が身につく iPhone/iPadアプリケーション開発の教科書》),因为它里面的路径就没有加“/”。作者估计模拟器跑通了就这样写上去了吧。

Swift使用NSKeyedArchiver进行数据持久化保存的经验的更多相关文章

  1. Android开发学习---android下的数据持久化,保存数据到rom文件,android_data目录下文件访问的权限控制

    一.需求 做一个类似QQ登录似的app,将数据写到ROM文件里,并对数据进行回显. 二.截图 登录界面: 文件浏览器,查看文件的保存路径:/data/data/com.amos.datasave/fi ...

  2. IOS开发--数据持久化篇之文件存储(一)

    前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不 ...

  3. redis下的持久化保存

    rdb.h   rdb.c  --->  完成数据保存到临时文件,再利用rename保存到指定文件的过程: 如果需要写一个数据持久化保存的功能时,可以参考这部分代码: //rdb API int ...

  4. PersistGate轻松几步让Redux实现数据持久化

    在开发的过程中,数据用redux管理,觉得希望将数据持久化保存,也就是说当用户下一次打开app或网站的时候,我们希望浏览器/APP自动加载出上次的数据,怎么办?有没有一个

  5. iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

    IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名 ...

  6. iOS - Swift 数据持久化

    1.Sandbox 沙箱 iOS 为每个应用提供了独立的文件空间,一个应用只能直接访问为本应用分配的文件目录,不可以访问其他目录,每个应用自己独立的访问空间被称为该应用的沙盒.也就是说,一个应用与文件 ...

  7. IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile

    //2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够 ...

  8. 数据持久化之NSKeyedArchiver

    基本的数据类型如NSString.NSDictionary.NSArray.NSData.NSNumber等可以用属性列表的方法持久化到.plist 文件中,但如果是一些自定义的类的话,属性列表的方法 ...

  9. 数据持久化(一)--NSKeyedArchiver

    数据持久化:  将内存中的数据按某种格式存进磁盘 数据的种类: 1,结构化的数据 2, 字节流数据 结构化的数据        字节流 内存中结构化的数据   ->   磁盘,  叫: 归档 字 ...

随机推荐

  1. mysql5.7 慢查底里失败的原因

    正确配置: log_output          = FILEslow-query-log = on slow_query_log_file ="D:/MySQL5.7/data/slow ...

  2. kafka设计原理介绍

    背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能 高吞吐 ...

  3. debian vmwareTools安装总结

    1.安装GCC编译器和make:      因为安装VMwareTools需要编译和make所以要先安装它们.安装其实很简单,命令如下: apt-get install gcc make 其实你也可以 ...

  4. 【ACM】魔方十一题

    0. 前言打了两年的百度之星,都没进决赛.我最大的感受就是还是太弱,总结起来就是:人弱就要多做题,人傻就要多做题.题目还是按照分类做可能效果比较好,因此,就有了做几个系列的计划.这是系列中的第一个,解 ...

  5. 扫描.net dll引用dll

    最近升级系统里的NHibernate,从3.3到4,项目工程太多, 一个模块分bll,dal,model,web,test,10几个模块,就要60多dll,升级一次太头疼. 编译过后,有时候会有的dl ...

  6. (转)關於flashback query的ORA-01466錯誤

    摘自:http://blog.sina.com.cn/s/blog_70a2bdb80100pqid.html 使用Oracle 10g 新特性flashback query來查詢過去修改並已提交的記 ...

  7. GreenDao 工具类 --- 使用 Json 快速生成 Bean、表及其结构,"炒鸡"快!

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  8. 微信小程序-实战巩固(二)

    刚刚写了小程序入门没几天,小程序就开放个人开发者资格,感觉为我而来啊 \(≧▽≦)/.迫不及待的去注册,准备将之前的处女作传上去体验一把,结果卡在了服务器配置上:免费的果然不靠谱/(ㄒoㄒ)/~~,后 ...

  9. 项目记事【SpringMVC-1】:后台接收前端传来的JSON,并转成对象

    背景: 最近项目中使用SpringMVC,需要从前端接收JSON格式的请求,在后端自动转成一个与JSON格式相同的对象. 由于是一个老项目,Spring的版本是3.2.7. 问题1:POST or G ...

  10. localhost访问不了的解决方法

    c:\windows\system32\drivers\etc\hosts 用记事本打开,加入一行 127.0.0.1       localhost