在IOS中,对于数据的持久化存储,IOS提供了四种机制,分别是:
1、属性列表
2、对象归档
3、数据库存储(SQLITE)
4、Core Data
下面我们主要说明一下属性归档,属性归档需要用到NSUserDefaults
NSUserDefaults类介绍
NSUserDefaults提供了一个类与系统进行交互接口。默认的系统允许一个应用来定制它的行为以适应用户的喜好。
如,你可以允许用户决定你的应用程序显示什么样的计量单位或者文件多少时间自动保存。应用程序在用户默认的数据库里分配记录的参数值。这些参数被作为默认值,
因为他们通常用于确定一个用用程序在启动时的默认状态或者默认状态的作用方式。
在运行时,你可以使用NSUserDefaults对象读取你应用程序从一个用户默认数据库使用的默认数据。NSUerDefaults缓存信息,
可以避免每次获取一个默认值都需要打开用户默认的数据库。同步方法,它会每隔一段时间自动调用,使内存中缓存的信息与用户默认数据库中的信息同步。
NSUserDefaults类提供了一个方便的方式来访问常见的类型,这些类型有floats,doubles,integers,booleans和URLs。一个默认的对象必须是一个属性列表,
也就是一个实例(或者集合实例的组合),NSData,NSString,NSNumber,NSDate,NSArray或者NSDictionary的实例。如果你想存储其它类型的对象,你应当将其转换成一个NSData的实例。
欲了解更多详细信息,请参阅首选项和设置编程指南。
即使设置了一个可变的值,使用NSUserDefaults获取值得方式也是不变的,例如,你设置了一个可变的字符串作为"MyStringDefault"键的值,以后你使用stringForKey:或者值得方式也是不变的
默认数据库为每个用户自动创建。NSUserDefaults目前不支持每一个主机的偏好(设置)。要做到这一点,你必须使用CFPreferences API (see Preferences Utilities Reference).
然而,NSUserDefaults能正确的读取每台主机的偏好,所以你可以安全地混合CFPreferences与NSUserDefaults的代码。
NSUserDefaults常用方法说明
1、获取NSUserDefaults的一个实例,单例模式
+ (NSUserDefaults *)standardUserDefaults
2、数据持久化
同步变化Default中,并且释放内存中的值
+ (void)resetStandardUserDefaults
写所有在域中的数据以及没有更新的数据到磁盘
- (BOOL)synchronize
3、获取Defaults值
-dataForKey:
-dictionaryForKey:
-stringForKey:
-objectForKey:
4、设置Defaults值
-setObject:forKey:
-setDouble:forKey:
5、移除Defaults值
-removeObjectForKey:
6、注册Defaults,这个不会被写到磁盘上,除非再次调用了设置Defaults值得方法
- (void)registerDefaults:(NSDictionary *)dictionary
7、返回搜索列表中对应域的所有键值对
-dictionaryRepresentation
备注:这些都是Obj-C的部分写法,Swift的写法可以通过最下方的网址查看官网
//经常出现在appDelegate.m的- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中,每次启动的时候读取 //如果里面已经有保存的key,那么就不会在书写了 //NSDictionary *defaultvalues =[NSDictionary dictionaryWithObjectsAndKeys:@"blue",@"color",@"china",@"location", nil]; //[[NSUserDefaults standardUserDefaults] registerDefaults:defaultvalues]; NSUserDefaults *plistuser = [NSUserDefaults standardUserDefaults]; //设置Defaults的值 [plistuser setInteger:2 forKey:@"grade"]; //保存数据 [NSUserDefaults resetStandardUserDefaults]; [plistuser setObject:@"abc" forKey:@"password"]; [plistuser synchronize]; [plistuser setObject:@"def" forKey:@"password"]; [plistuser synchronize]; [plistuser setObject:@"admin" forKey:@"username"]; [plistuser synchronize]; //获取Defaults的值 NSString *password = [plistuser objectForKey:@"password"]; NSLog(@"password:%@",password); //移除Defaults的值 [plistuser removeObjectForKey:@"username"]; [plistuser synchronize];//保存数据 //获取所有的plist中所有的键值对 NSDictionary *allDic =[plistuser dictionaryRepresentation]; NSLog(@"所有的键值对:%@",allDic);
上面说的都是操作系统的Plist,下面我们来说一下自己添加的plist文件,首先新建一个plist,命名UserInfo,截图如下:
创建完成以后再里面写入些数据,如下图:
写入数据完成之后用source code查看到plist,其实就是一个xml文件,
下面我们就实现plist,读写与创建,具体说明在注释中有,代码如下:
- (void)viewDidLoad { NSUserDefaults *userdefaults =[NSUserDefaults standardUserDefaults]; [userdefaults setObject:@"2014-10-10" forKey:@"lastupdate"]; [userdefaults setObject:@"doubleicon" forKey:@"username"]; [userdefaults setInteger:10 forKey:@"cache"]; [userdefaults setObject:@"123456" forKey:@"password"]; [userdefaults synchronize]; NSString *name = [userdefaults objectForKey:@"username"]; NSLog(@"username:%@",name); [userdefaults removeObjectForKey:@"password"]; [NSUserDefaults resetStandardUserDefaults]; //读取plist,在appName目录下面 NSString *plistpath =[[NSBundle mainBundle] pathForResource:@"UserInfo" ofType:@"plist"]; NSMutableDictionary *UserDic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistpath]; NSLog(@"UserInfo:%@",UserDic); //修改plist NSDictionary *newDic =[NSDictionary dictionaryWithObjectsAndKeys:@"22",@"age",@"Male",@"Sex", nil]; [UserDic setObject:newDic forKey:@"Sandy"]; [UserDic writeToFile:plistpath atomically:YES]; //通过代码创建与保存plist //获取应用程序沙盒 NSArray *libraryArray =NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES); NSString *librarypath =[libraryArray objectAtIndex:0]; NSString *destpath =[[librarypath stringByAppendingString:@"/Preferences"] stringByAppendingPathComponent:@"my.plist"]; NSMutableDictionary *hobbyDic =[[NSMutableDictionary alloc] initWithContentsOfFile:destpath]; if(hobbyDic==nil){//判断是否督导值 hobbyDic =[[NSMutableDictionary alloc] init]; } [hobbyDic setObject:@"20" forKey:@"grade"]; [hobbyDic writeToFile:destpath atomically:YES];//保存 NSMutableDictionary *savedDic =[[NSMutableDictionary alloc] initWithContentsOfFile:destpath]; NSLog(@"以保存过的数据:%@",savedDic); [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. }
参考:https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSUserDefaults_Class/index.html