iOS 数据的存储之 Property List (属性列表)

2019-02-20  本文已影响0人  Cc馒头

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

上一篇下一篇

猜你喜欢

热点阅读