iOS 数据的存储之 Property List (属性列表)
在每一个APP中,数据持久化是必要的,也是我们都需要掌握的,那么什么才是持久化呢?所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据。有时当我们在无网络的情况也要显示数据信息的时候,那么数据的持久化就起到了作用。
目录
1、 Property List (属性列表)
2、NSUserDefaults (偏好设置)
3、NSKeyedArchiver (归档)
待续。。。
(一)Property List (属性列表)
简介:我们经常在项目中可以看到info.plist文件,这个文件就是属性列表文件,简称plist文件。这一类文件,只能存储系统直带的数据类型,不支持自定义对象存储,一般是用来存储数据量小,而且内容不容易变更的数据。
主要用途:接口名、城市名、银行名称 等。
存储类型:NSString、NSNumber、BOOL、NSDictionary、NSArray、NSData、NSDate 等。
1、创建plist文件:
① 快捷键创建:command + N 选择 Property list
② 右击文件目录 ---> 选择"New File..." --->选择"Property List" ---> 输入plist文件名并在窗口中点击Create创建
创建plist正确的打开方式
2、plist的赋值:
plist的赋值
3、plist的使用方式(如下代码)
1)获取文件路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [path stringByAppendingPathComponent:@"city.plist"];
2)plist文件的存储(写入)
*注:atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
2.1 NSMutableDictionary 的存储方式
NSMutableDictionary *dic = [NSMutableDictionary dictionary];
[dic setObject:@"18" forKey:@"age"];
[dic setObject:@"胡杨" forKey:@"name"];
[dic writeToFile:plistPath atomically:YES];
2.2 NSArray 的存储方式
NSArray *array = @[@"1",@"2",@"3",@"4"];
[array writeToFile:fileName atomically:YES];
3)plist文件的读取
3.1 NSMutableDictionary 的读取方式
NSString *plistPath = [fileName stringByAppendingPathComponent:@"myTestPlist.plist"];//fileName为文件路径
NSMutableDictionary *dataDic = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
3.2 NSArray 的读取方式
NSString *plistPath = [fileName stringByAppendingPathComponent:@"myTestPlist.plist"];//fileName为文件路径
NSArray *result = [NSArray arrayWithContentsOfFile: plistPath];
(二)NSUserDefaults (偏好设置)
简介:NSUserDefaults 也是只能保存系统自带的数据类型,不能保存自定义的类型。NSUserDefaults是将输入的数据保存在plist文件下,数据是自动保存在Libarary/Preferences目录下。有时候需要保存用户数据,但是数据量又不是很多,用SQLite3觉得不大合适,这时候用UserDefaults偏好设置是一个不错的选择。
存储类型:NSString、NSNumber、BOOL、NSDictionary、NSArray、NSData、NSDate 等。
1、NSUserDefaults 的使用
1)数据的写入
//获得NSUserDefaults文件
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
//数据保存到NSUserDefaults中
[userDefaults setObject:@"张三" forKey:@"UserName"];
[userDefaults setBool:YES forKey:@"UsrSelected"];
[userDefaults setObject:dictionary forKey:@"DefaultUserData"];
//立即同步
[userDefaults synchronize];
2)数据的读取
//获得NSUserDefaults文件
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
//读取对于的数据
NSString *name = [userDefaults objectForKey:@"UserName"];
BOOL sex = [userDefaults boolForKey:@"UsrSelected"];
NSMutableDictionary *userdictionary = [userDefaults objectForKey:@"DefaultUserData"];
3)删除NSUserDefaults 对于的数据
//获得NSUserDefaults文件
NSUserDefaults * userDefaults = [NSUserDefaults standardUserDefaults];
//删除对于的数据
[userDefault removeObjectForKey:@"DefaultUserData"];
//立即同步
[userDefault synchronize];
(三)NSKeyedArchiver (归档)
简介:归档在iOS 中是另外一种形式的序列化,可以储存自定义数据类型。使用归档,必须遵守NSCoding协议或者NSSecureCoding协议,绝大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议(如果采用NSSecureCoding协议,必须重写supportsSecureCoding 方法并返回YES)。而相对于Plist和NSUserDefaulst的存储方式而言,归档后的文件是加密过的,所以安全性相比之下比较高。
1、举例子说明
1)创建UserObject
UserObject.h
@interface UserObject : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
//自定义的归档保存数据的方法
+ (void) saveUser:(UserObject *)user;
//自定义的读取沙盒中解档出的数据
+ (UserObject *) getUser;
UserObject.m
#import "UserObject.h"
@implementation UserObject
/** 描述当前对象里面的哪些属性要归档 aCoder:用来归档 */
- (void) encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
}
/** 描述当前对象里面的哪些属性要解档 */
- (instancetype) initWithCoder:(NSCoder *)coder{
if (self = [super init]) {
//注意一定要给成员变量赋值保存起来
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
return self;
}
//自定义的归档保存数据的方法
+ (void) saveUser:(UserManager *)user{
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *path = [docPath stringByAppendingPathComponent:@"UserInfo.plist"];
[NSKeyedArchiver archiveRootObject:user toFile:path];
}
//自定义的读取沙盒中解档出的数据
+ (UserManager *) getUser{
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
NSString *path = [docPath stringByAppendingPathComponent:@"UserInfo.plist"];
UserManager *user = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
return user;
}
2)创建ViewController,并且使用归档
ViewController.m
/** 自定义对象想要归档,则自定义对象必须遵守NSCoding协议,实现协议方法 */
#pragma mark - NSKeyedArchiver(归档)
- (void) keyedArchiverSaveOnUserData {
UserObject *userSaveObject = [[UserObject alloc]init];
userSaveObject.name = @"张三";
userSaveObject.age = 15;
[UserObject saveUser: userSaveObject];//归档
self.saveLabel.text = [NSString stringWithFormat:@"%@ %zd", userSaveObject.name, userSaveObject.age];
}
#pragma mark - NSKeyedArchiver(解档)
- (void)keyedArchiverReadOnUserData {
UserObject *userReadObject = [UserObject getUser];//解档
self.readLabel.text = [NSString stringWithFormat:@"%@ %zd", userReadObject.account, userReadObject.age];
}