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在模拟器上运行毫无问题,但是插上手机在实机上测试,就保存失败了!搜索了半天资料,发现stackoverflow上有个人与我遇到了同样的问题。后来经过调试,原来是我路径中没有加"/"。如果不加“/”,就变成了在应用主目录下生成一个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. The algorithm of entropy realization

    近似熵的一种快速实用算法 Pincus提出的近似熵算法中有很多冗余的计算,效率低,速度慢,不利于实际应用,洪波等人在定义的基础上引入二值距离矩阵的概率,提出了一种实用快速的算法. function A ...

  2. vsftpd.conf 详解

    //不允许匿名访问 anonymous_enable=NO //设定本地用户可以访问.注意:主要是为虚拟宿主用户,如果该项目设定为NO那么所有虚拟用户将无法访问 local_enable=YES // ...

  3. RF和adaboost

    通过对所有的决策树进行加总来预测新的数据(在分类时采用多数投票,在回归时采用平均).

  4. C# 下载文件的四种方法

    C# 文件下载四方法 - CSDN论坛 - CSDN.NET using System; using System.Data; using System.Configuration; using Sy ...

  5. HTML+CSS小技巧

    网页标题前引入ico图标 <link rel="shortcut icon" href="img/icoTest.ico">

  6. Ubuntu16.4 修改静态ip地址

    root@temple-102:~# ifconfig eno1 Link encap:Ethernet HWaddr 0c:c4:7a:e6:49:74 UP BROADCAST MULTICAST ...

  7. 【ghost初级教程】 怎么搭建一个免费的ghost博客

    ghost博客系统无疑是这个月最火热的话题之一,这个号称”只为博客“的系统,早在项目开始之初就受到了众人的关注.它使用了当前最火热node.js技术,10月14日发布了V0.3.3版本.江湖传言它将是 ...

  8. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  9. PHP 中如何正确统计中文字数

    PHP 中如何正确统计中文字数?这个是困扰我很久的问题,PHP 中有很多函数可以计算字符串的长度,比如下面的例子,分别使用了 strlen,mb_strlen,mb_strwidth 这个三个函数去测 ...

  10. HDU 6030 Happy Necklace

    矩阵快速幂. 因为任意素数长度都要满足,所以$3$必须满足,$3$一旦满足,其余的肯定满足,也就是说只要考虑字符串末尾两位即可,$dp$一下就可以算方案数了.$n$较大,可以矩阵加速. #includ ...