iOS 数据的存储之 Property List (属性列表) 、NSUserDefaults (偏好设置) 、NSKeyedArchiver (归档)【总结 一】

在每一个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];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容