数据存储

2016-09-01  本文已影响19人  Mario_ZJ

沙盒介绍

沙盒目录的获取方式

/*参数解读:
    directory:获取哪个文件夹
    domainMask:在哪个路径下搜索
    expandTilde:是否展开路径.
    这个方法获取出的结果是一个数组.因为有可以搜索到多个路径.
*/
NSSearchPathForDirectoriesInDomains(<#NSSearchPathDirectory directory#>, <#NSSearchPathDomainMask domainMask#>, <#BOOL expandTilde#>)

数据本地化存储的方式

1.plist文件

这种方式存储数据,只能以系统能识别的数据模型或对象进行存储,不能是自定义的模型或对象

示例:
 NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
NSArray *array = @[@"xmg",@10];
//拼接文件名
NSString *filePath = [path stringByAppendingPathComponent:@"array.plist"];
NSLog(@"%@",filePath);
//把数组写入到沙盒当中.
[array writeToFile:filePath atomically:YES];
    NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    //拼接文件名
    NSString *filePath = [path stringByAppendingPathComponent:@"array.plist"];
    NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",array);

注意:不能存储自定义的模型或对象,以下代码无法将设置的字典数据写大指定的路径

Person *per = [[Person alloc] init];
    per.name = @"xmg";
    per.age = 12;
    NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [path stringByAppendingPathComponent:@"dict.plist"];
    NSLog(@"%@",filePath);
    NSDictionary *dict = @{@"per" : per,@"age" : @20};
    [dict writeToFile:filePath atomically:YES];

2.偏好设置(也是以plist文件的形式存储)

同plist存储方式相同,也只能存储系统识别的格式(不能存储自定义模型,对象等)
但是存储的内容与plist不同,存储的内容相对于plist来说较少,通常存储系统版本信息,用户名,密码等

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    [defaults setObject:@"xmg" forKey:@"name"];
    [defaults setInteger:20 forKey:@"age"];
    [defaults setBool:YES forKey:@"isBool"];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *name = [defaults objectForKey:@"name"];
    NSInteger age = [defaults integerForKey:@"age"];
    BOOL isBool = [defaults boolForKey:@"isBool"];

3.归档

存储相对较大的文件,归档要求被存取的对象遵守NSCoding协议,并实现initWithCode和encodingWithCode方法,归档可以存储任何数据

 Person *per = [[Person alloc] init];
    per.name = @"xmg";
    per.age = 12;
    //获取文件路径
    NSString *path =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
//存储的文件的文件名和后缀可以随意起,但一般要起有意义的名称
    NSString *filePath = [path stringByAppendingPathComponent:@"per.data"];
    //底层会自动调用encodeWithCoder:方法,问下,要保存定义的对象哪些属性
    [NSKeyedArchiver archiveRootObject:per toFile:filePath];

**注意: **这里需要在Person类中实现initWithCode方法,以存储想要存储的数据

//Person类中的.m文件
//问下,要读取对象哪些属性
-(void)encodeWithCoder:(NSCoder *)aCoder {
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
}
    NSString *path =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *filePath = [path stringByAppendingPathComponent:@"per.data"];
    //unarchiveObjectWithFile:底层会自动调用initWithCoder:方法,问下,要读取对象哪些属性
    Person *per =  [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];

**注意: **这里需要在Person类中实现encodeWithCoder方法,以读取想要读取的数据

//Person类的.m文件
//保存当前对象的哪些属性.
-(instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super init]) {//这里之所以没有调用父类的initWithCoder方法,是因为父类没有遵守NSCoding协议
       self.name = [aDecoder decodeObjectForKey:@"name"];
       self.age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}

归档注意点:

上一篇 下一篇

猜你喜欢

热点阅读