关于NSuserdefault存储数据以及存储可变数据时的一些问题
2015-08-22 11:28
501 查看
小弟正在学 iOS,有一段时间了,用了几次nsuserdefault,发现一些问题记在这里共有需要的朋友参考和自勉
在项目中我们经常会遇到一些数据:这些数据是应用访问频率非常高,并且数据量不大用,来存储用户基本信息和一些应用设置的数据。比如说,在项目中作登录时可能会有自动登录,那么自动登录的账户名与密码从哪来呢,实际上我们就可以在用户选择自动登录时将用户名与密码保存到nsuserdefault中
使用的方法如下:
第一步:用户选择自动登录把信息存入default
NSUserDefaults *login = [NSUserDefaults standardUserDefaults];
[loginsetObject:nilforKey:@"account"];
[login
setObject:nilforKey:@"password"];(上面我把账户名和密码写成了nil)。
当然仅仅这样是不够的,这样也只是能够从应用中自动获取用户名和密码。
我们还得设置一个属性来记录用户设置是否自动登录:
[login setObject:@“1” forKey:@"autologin"];
第二步:登录时判断是否自动登录及
当程序启动时首先获得是否自动登录信息如果为@“1”那么再获取用户名与密码信息最后就直接登录了
NSUserDefaults*login
= [NSUserDefaultsstandardUserDefaults];//这里default的名字随便起只要你感觉顺眼
NSString *autologin =[loginobjectForKey:@"autologin"];
NSString *account = [loginobjectForKey:@"account"];
NSString *password = [loginobjectForKey:@"password"];
第三步:就是直接访问服务器登录了扯的太远了这里不在说。
这个对于小数据用起来很是方便然而问题出现了:
当我想用userdefualt存分组通讯录信息(以字典形式)时发现,无论你向userdefault存入的数据是可变的还是不可变的,取出来之后都会变成不可变的,无论你是声明成可变的还是怎么整她就是不可变的,那么你想直接修改数据就变得不可行了。那么我要添加一个联系人该怎么办呢,自己思考了一下想到这个方法:
NSUserDefaults *book = [NSUserDefaultsstandardUserDefaults];
NSDictionary *dic1 = [book objectForKey:@"NameString"];//先取出先前存入的字典数据
NSMutableDictionary *dic2 = [NSMutableDictionarydictionaryWithDictionary:dic1];//
利用已有字典数据创建一个新的可变字典
[dic2setObject:dic2forKey:@"NameString"];//对可变字典进行(添加/移除等)操作
[dressBooksetObject:dic2forKey:@"dressBook"];//最后将dic2存入default替换原先数据
这样就成功了。
然而,在运用时还是会出现问题,就是自己定义的类型(假设 class Person)无法直接存入到default,无论你用数组还是字典包装了person default无法识别person,必须将person转化为nsstring 、nsdictionary、nsarray、nsdata这些数据类型。这一部分我研究的还不是很懂,推荐一个地址http://my.oschina.net/u/1245365/blog/294449#OSC_h2_3
仅仅这些希望会对大家有些帮助~~
(第一次写博客,有什么写的不对的还请包涵由指正)
在项目中我们经常会遇到一些数据:这些数据是应用访问频率非常高,并且数据量不大用,来存储用户基本信息和一些应用设置的数据。比如说,在项目中作登录时可能会有自动登录,那么自动登录的账户名与密码从哪来呢,实际上我们就可以在用户选择自动登录时将用户名与密码保存到nsuserdefault中
使用的方法如下:
第一步:用户选择自动登录把信息存入default
NSUserDefaults *login = [NSUserDefaults standardUserDefaults];
[loginsetObject:nilforKey:@"account"];
[login
setObject:nilforKey:@"password"];(上面我把账户名和密码写成了nil)。
当然仅仅这样是不够的,这样也只是能够从应用中自动获取用户名和密码。
我们还得设置一个属性来记录用户设置是否自动登录:
[login setObject:@“1” forKey:@"autologin"];
第二步:登录时判断是否自动登录及
当程序启动时首先获得是否自动登录信息如果为@“1”那么再获取用户名与密码信息最后就直接登录了
NSUserDefaults*login
= [NSUserDefaultsstandardUserDefaults];//这里default的名字随便起只要你感觉顺眼
NSString *autologin =[loginobjectForKey:@"autologin"];
NSString *account = [loginobjectForKey:@"account"];
NSString *password = [loginobjectForKey:@"password"];
第三步:就是直接访问服务器登录了扯的太远了这里不在说。
这个对于小数据用起来很是方便然而问题出现了:
当我想用userdefualt存分组通讯录信息(以字典形式)时发现,无论你向userdefault存入的数据是可变的还是不可变的,取出来之后都会变成不可变的,无论你是声明成可变的还是怎么整她就是不可变的,那么你想直接修改数据就变得不可行了。那么我要添加一个联系人该怎么办呢,自己思考了一下想到这个方法:
NSUserDefaults *book = [NSUserDefaultsstandardUserDefaults];
NSDictionary *dic1 = [book objectForKey:@"NameString"];//先取出先前存入的字典数据
NSMutableDictionary *dic2 = [NSMutableDictionarydictionaryWithDictionary:dic1];//
利用已有字典数据创建一个新的可变字典
[dic2setObject:dic2forKey:@"NameString"];//对可变字典进行(添加/移除等)操作
[dressBooksetObject:dic2forKey:@"dressBook"];//最后将dic2存入default替换原先数据
这样就成功了。
然而,在运用时还是会出现问题,就是自己定义的类型(假设 class Person)无法直接存入到default,无论你用数组还是字典包装了person default无法识别person,必须将person转化为nsstring 、nsdictionary、nsarray、nsdata这些数据类型。这一部分我研究的还不是很懂,推荐一个地址http://my.oschina.net/u/1245365/blog/294449#OSC_h2_3
仅仅这些希望会对大家有些帮助~~
(第一次写博客,有什么写的不对的还请包涵由指正)
相关文章推荐
- 我是运营,我没有假期
- Tomcat端口被占用解决方法(不用重启)
- DB2数据库的安装
- C#实现把指定数据写入串口
- “传奇”图象数据存储方式
- 修复mysql数据库
- SQLServer 数据导入导出的几种方法小结
- MySQL数据备份之mysqldump的使用详解
- 超大数据量存储常用数据库分表分库算法总结
- C#实现窗体间传递数据实例
- SQL Server误区30日谈 第18天 有关FileStream的存储,垃圾回收以及其它
- 给你的数据库文件减肥
- Oracle数据更改后出错的解决方法
- C#将Sql数据保存到Excel文件中的方法
- C++实现图的邻接表存储和广度优先遍历实例分析
- 把excel表格里的数据导入sql数据库的两种方法
- 用文本作数据处理
- 桌面中心(一)创建数据库
- 桌面中心(四)数据显示
- Wireshark系列之6 数据流追踪