使用 NSUserDefaults 读取和写入自定义对象
众所周知,NSUserDefaults只能保存诸如NSArray、NSDictionary、NSData、NSNumber等基本数据类型,如果我们强制保存自定义的类,就会出现这个错误:Attempt to set a non-property-list object as an NSUserDefaults value for ,解释起来:【试图将一个非属性列表对象设置为 NSUserDefaults】接下来就说说如何吧自定义的对象保存到NSUserDefaults中去。
自定义的类实现<NSCoding>协议中的- (id) initWithCoder: (NSCoder *)coder方法和- (void) encodeWithCoder: (NSCoder *)coder方法
#pragma mark NSCoding
- (id)initWithCoder:(NSCoder *)aDecoder{ // 解码
if (self == [super init]) {
alias = [aDecoder decodeObjectForKey:JSON_NAME];
mobile = [aDecoder decodeObjectForKey:JSON_MOBILE];
signtime = [[aDecoder decodeObjectForKey:JSON_TIMESTAMP] longValue];
endtime = [[aDecoder decodeObjectForKey:JSON_END_TIME] longValue];
cmobile = [aDecoder decodeObjectForKey:JSON_CMOBILE];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder{ // 编码
[aCoder encodeObject:alias forKey:JSON_NAME];
[aCoder encodeObject:mobile forKey:JSON_MOBILE];
[aCoder encodeObject:[NSNumber numberWithLong:signtime] forKey:JSON_TIMESTAMP];
[aCoder encodeObject:[NSNumber numberWithLong:endtime] forKey:JSON_END_TIME];
[aCoder encodeObject:cmobile forKey:JSON_CMOBILE];
}
保存到NSUSerDefault:
Terminal *terminal = [[Terminal alloc] init];
terminal.alias = [dict objectForKey:JSON_NAME];
terminal.mobile = [dict objectForKey:JSON_MOBILE];
terminal.signtime = [[dict objectForKey:JSON_TIMESTAMP] longValue];
terminal.endtime = [[dict objectForKey:JSON_END_TIME] longValue];
terminal.cmobile = [dict objectForKey:JSON_CMOBILE];
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:terminal];
[userDefaults setObject:data forKey:"test"];
[userDefaults synchronize];
也就是说,我们保存自定义对象时,是使用NSKeyedArchiver 把数据归档为NSData对象,然后把NSData存储到UserDefault中,NSData相当于Model
读取:
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
NSData *data = [userDefaults objectForKey:"test"];
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
读取自定义对象时,先获取到NSData,然后使用NSKeyedUnarchiver解档为自定义的对象
LOG输出,查看结果:
2014-12-10 16:31:11.815 ESO_Etws[1463:60b] alias:Q611-0334
2014-12-10 16:31:11.815 ESO_Etws[1463:60b] mobile:13841040334
2014-12-10 16:31:11.815 ESO_Etws[1463:60b] signtime:1394529151000
2014-12-10 16:31:11.816 ESO_Etws[1463:60b] endtime:1426065151000
2014-12-10 16:31:11.816 ESO_Etws[1463:60b] cmobile:
PS:
APP升级后,UserDefaults中原有的plist是不会删除的,除非用户卸载APP
清除整个UserDefaults数据的方法:
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain]; // 持久的
使用 NSUserDefaults 读取和写入自定义对象的更多相关文章
- NSUserDefaults读取和写入自定义对象
NSUserDefaults可以存取一些短小的信息. 比如存入再读出一个字符串到NSUserDefaults: - NSString *string = [NSString stringWithStr ...
- Unity 读取、写入自定义路径文件,调用System.Windows.Forms
调用System.Windows.Forms DLL 首先在Unity新建Plugins文件夹添加System.Windows.Forms.dll 然后代码中添加引用 using System; us ...
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
摘要: NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密码,网址等,NSUserDefaults肯定是首选,但是如果我们自定义了一个对象,对象保存的 ...
- 转-NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象
转自:http://my.oschina.net/u/1245365/blog/294449 摘要 NSUserDefaults适合存储轻量级的本地数据,一些简单的数据(NSString类型的)例如密 ...
- iOS开发——UI进阶篇(十一)应用沙盒,归档,解档,偏好设置,plist存储,NSData,自定义对象归档解档
1.iOS应用数据存储的常用方式XML属性列表(plist)归档Preference(偏好设置)NSKeyedArchiver归档(NSCoding)SQLite3 Core Data 2.应用沙盒每 ...
- NSUserdefaults 简介以及存储自定义数据类型的方法
一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个单例,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一 ...
- iOS 自定义对象及子类及模型套模型的拷贝、归档存储的通用代码
一.runtime实现通用copy 如果自定义类的子类,模型套模型你真的会copy吗,小心有坑. copy需要自定义类继承NSCopying协议 #import <objc/runtime.h& ...
- IOS 如何持久化自定义对象 2014-08-01 01:38
如果持久话自定义对象 那么这个对象一定要遵循 NSCoding 协议 并实现编解码:然后再将编解码后的数据 NSKeyedArchiver 到NSData中 @interface NSKeyAnd ...
- NSUserDefaults 简介,使用 NSUserDefaults 存储自定义对象 - lady-奕奕的个人空间 - 开源中国社区
一.了解NSUserDefaults以及它可以直接存储的类型 NSUserDefaults是一个,在整个程序中只有一个实例对象,他可以用于数据的永久保存,而且简单实用,这是它可以让数据自由传递的一个前 ...
随机推荐
- MVC之联动学习
一,数据库表设计 CREATE TABLE [dbo].[HY_Province]( [id] [INT] NOT NULL, [province] [NVARCHAR]() NOT NULL, CO ...
- 基于html5 canvas 的强大图表插件【Chart.js】
名词解释 Chart.js:是基于html5和canvas的强大图表插件,支持多样的图表形式,柱状线性饼环极地雷达等等: canvas:只兼容到IE9 excanvas.js:强大的第三方兼容插件,可 ...
- 搭建git代码服务器
在代码管理中,通常需要使用版本管理工具,git就是一个不错的选择,这里简单罗列一下git服务器的搭建过程. 1. 安装git工具包 2. 初始化git库:在代码服务器上,通常只需要创建一个不含有工作目 ...
- oracle查询排序后的前几条记录
select * from (select * from table order by 字段名 desc) where rownum<你要查的记录条数,这样才能符合条件.
- 我的JAvA第三天
- python基础(八)-迭代器与生成器
一.迭代器 li=[1,2,3] f=li.__iter__() print(f) print(f.__next__()) print(f.__next__()) print(f.__next__() ...
- Java的设计模式----strategy(策略模式)
设计模式: 一个程序员对设计模式的理解: “不懂”为什么要把很简单的东西搞得那么复杂.后来随着软件开发经验的增加才开始明白我所看到的“复杂”恰恰就是设计模式的精髓所在,我所理解的“简单”就是一把钥匙开 ...
- angular.js跨域post解决方案
跨域,前端开发中经常遇到的问题,AngularJS实现跨域方式类似于Ajax,使用CORS机制. 下面阐述一下AngularJS中使用$http实现跨域请求数据. AngularJS XMLHttpR ...
- Oracle Day09 存储与触发器
1.存储 存储过程.存储函数:指存储在数据库中供所有用户程序调用的子程序. --创建存储过程(procedure) --用create procedure 命令建立存储过程. 格式: create o ...
- C++ 简史
Bjarne Stroustrup 这哥们在剑桥读博的时候,需要实现一个分布式的操作系统.仔细一想,自己在丹麦读大学的时候就用过 Simula,记得它的「类型表达」.「编译排错」能力以及「类」和「协程 ...