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. MySQL5.6.26升级到MySQL5.7.9实战方案【转】

    MySQL5.6.26升级到MySQL5.7.9实战方案 转自 MySQL5.6.26升级到MySQL5.7.9实战方案 - 其他网络技术 - 红黑联盟http://www.2cto.com/net/ ...

  2. sea.js中的checkbox批量操作

    <table width="100%" border="0" cellspacing="0" cellpadding="0& ...

  3. java基础14 多态(及关键字:instanceof)

    面向对象的三大特征: 1.封装   (将一类属性封装起来,并提供set()和get()方法给其他对象设置和获取值.或者是将一个运算方法封装起来,其他对象需要此种做运算时,给此对象调用) 2.继承   ...

  4. <转>MYSQL数据库数据拆分之分库分表总结

    数据存储演进思路一:单库单表 单库单表是最常见的数据库设计,例如,有一张用户(user)表放在数据库db中,所有的用户都可以在db库中的user表中查到. 数据存储演进思路二:单库多表 随着用户数量的 ...

  5. 后门技术和Linux LKM Rootkit详解

    2010-01-15 10:32 chinaitlab chinaitlab 字号:T | T 在这篇文章里, 我们将看到各种不同的后门技术,特别是 Linux的可装载内核模块(LKM). 我们将会发 ...

  6. Suse Linux下NTP缓慢调整配置,转载至http://www.gpstime.com.cn/

    (1)系统内若有使用crontab 进行与时间调整相关的例行性工作排程,应注释掉(命令人工crontab -e修改,删除定时同步任务ntpdate -s ntpserver). (2)修改ntp配置文 ...

  7. 配置Tomcat、maven远程部署调试总结。

    注意:可以搞两个环境,一个本地tomcat 一个服务器上的tomcat ,然后都采用如下配置.这样就可以 在本地调试,调试好后,再发布到服务器端.非常方便.  ==================== ...

  8. Web开发:URL编码与解码

    通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key= ...

  9. scrollview 滚动布局

    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"    android:layou ...

  10. C#窗体内嵌外部程序(cmd.exe)的显示【转载】

    [DllImport("User32.dll ", EntryPoint = "SetParent")] private static extern IntPt ...