博客> 浅析 iOS 数据存储
浅析 iOS 数据存储
2小时前 评论:0 阅读:1273 飞哥
ios 沙盒机制 数据存储 持久化归档

在开发iOS应用过程中,数据存储是必须的,为了不至于每次都从网络获取,而产生等待菊花或空白页的体验不好,这是必须的。

接下来,就来说说在iOS开发中,常用的几种数据存储方式:

1、NSUserDefoult,最好就是看 NSUserDefault官方文档

这也是我接触最早的一个数据存储方式了,NSUserDefaults是iOS系统提供的一个单例类(iOS提供了多个单例类),通过类方法standardUserDefaults可以获取NSUserDefaults单例.

// 保存数据 [[NSUserDefaults standardUserDefaults]setObject:@"object" forKey:@"key"]; // 取出数据 [[NSUserDefaults standardUserDefaults]objectForKey:@"key"];

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; // 立即保存 [defaults synchronize];

其中:synchronise 是强制存储的意思,如果调用这是立即存储,如果不调用,系统也会默认调用,不过不是立即执行而已,是否需要,自己选择。

NSUserDefoult基本上支持所有的数据类型和对象,有:NSNumber(Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,BOOL类型; 此外,对于其他类型的数据,如果需要用NSUserDefoult来存储的话,可以下将其归档为NSData类型,在存入到NSUserDefoult中。比如,

NSNumber类型() // 保存数据 [[NSUserDefaults standardUserDefaults]setInteger:1 forKey:@"key"]; // 取出数据 [[NSUserDefaults standardUserDefaults]IntegerForKey:@"key"];

对于存取bool类型: // 保存数据 [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"key"]; // 取出数据 [[NSUserDefaults standardUserDefaults]integerForKey:@"key"];

对于存取bool类型: // 保存数据 [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"key"]; // 取出数据 [[NSUserDefaults standardUserDefaults]boolForKey:@"key"];

NSUserDefaults域,有一个问题,当 BOOL booValue = [[NSUserDefaults standardUserDefaults] boolForKey:@"bool"]; 这种情况下,当系统中已经设置了这个值得时候,返回正常,但是如果没有设置,系统就默认返回NO,设置的NO一样,这样就会产生误解。这种情况下,可以使用registerDefaults来解决:具体做法是 首先创建一个包含用户偏好设置信息的UserDefault.plist文件,添加到target中。在运行时,app就可以加载这个文件并且把内容传到registerDefaults :

NSURL defaultPrefsFile = [[NSBundle mainBundle] URLForResource:@"UserDefault" withExtension:@"plist"]; NSDictionary defaultPrefs = [NSDictionary dictionaryWithContentsOfURL:defaultPrefsFile]; [[NSUserDefaults standardUserDefaults] registerDefaults:defaultPrefs];

并将代码放到application:didFinishLaunchingWithOptions中,这样做的原因是:默认情况下,应用域是空的,没见键也没有值。当应用第一次设置某项用户偏好设置的值时,相应的值会通过指定的键加入应用域。当通过NSUserDefaults获取某项用户偏好设置的值时,NSUserDefaults会先在应用域中查找,如果找到了值,NSUserDefaults就会返回这个值。如果没有找到,NSUserDefaults就会在注册域中查找并返回默认值。

域: user defaults数据库中其实是由多个层级的域组成的,当你读取一个键值的数据时,NSUserDefaults从上到下透过域的层级寻找正确的值,不同的域有不同的功能,有些域是可持久的,有些域则不行。

应用域:是最重要的域,它存储着你app通过NSUserDefaults set...forKey添加的设置。 注册域:仅有较低的优先权,只有在应用域没有找到值时才从注册域去寻找。 全局域:则存储着系统的设置 语言域:则包括地区、日期等 参数域:有最高优先权

参考文章:http://code.tutsplus.com/tutorials/ios-sdk-working-with-nsuserdefaults--mobile-6039

收藏
2
sina weixin mail 回到顶部