ios

数据存储

2016-04-11  本文已影响86人  可可西李

NO.1前言

1、iOS应用数据存储的常用方式

NO2.操做

1、应用沙盒

2、应用沙盒结构分析

3、应用沙盒目录的常见获取方式

// 获取沙盒路径

    // directory:获取哪个文件夹
    // domainMask:在哪个范围内搜索,NSUserDomainMask:表示在用户的手机上查找
    // expandTilde:是否展开全路径 YES:表示展开全路径 NO:不会展开全路径,会把应用沙盒的路径用波浪号(~)代替
    // 获取到Caches文件夹路径
    NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];

    // 拼接文件名
    NSString *filePath = [cachePath stringByAppendingPathComponent:@"arr.plist"];

    // 1、存储plist,File:文件的全路径
    [arr writeToFile:filePath atomically:YES];
    // 2、读取plist,之前是什么类型存储的,读取也是什么
    NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
    //  写入
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //    [userDefaults setBool:NO forKey:@"jhyes"];
    //    [userDefaults setObject:@"ljh" forKey:@"name"];
    [userDefaults setValue:@"JHL" forKey:@"NAME"];
    // 数据持久化
    [userDefaults synchronize];

    // 9 读取
    NSUserDefaults *redDef = [NSUserDefaults standardUserDefaults];
    //    BOOL result = [redDef boolForKey:@"jhyes"];
    //    NSString *result = [redDef objectForKey:@"name"];
    NSString *result = [redDef valueForKey:@"NAME"];
    NSLog(@"result = %@", result);
}

4、偏好设置

保存:
    // 获取单例
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // @"123" key:pwd
    [defaults setObject:@"123" forKey:@"pwd"];

    // bool
    [defaults setBool:YES forKey:@"isOn"];

    // int
    [defaults setInteger:10 forKey:@"num"];

读取:
    // 利用NSUserDefaults单例
   NSString *pwd = [[NSUserDefaults standardUserDefaults] objectForKey:@"pwd"];
   NSInteger i = [[NSUserDefaults standardUserDefaults] integerForKey:@"num"];

5、属性列表

// 写入:
// 将一个NSDictionary对象归档到一个plist属性列表
// 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"coderLee" forKey:@"name"];
[dict setObject:@"13903058421" forKey:@"phone"];
[dict setObject:@"27" forKey:@"age"];
// 将字典持久化到Documents/stu.plist文件中
[dict writeToFile:path atomically:YES];

// 读取:
// 读取属性列表,恢复NSDictionary对象
[dict dictionaryWithContentsOfFile:path];

6、NSData

1)NSData-归档2个Person对象到同一文件中

归档(编码)

// 新建一块可变数据区
NSMutableData *data = [NSMutableData data];
// 将数据区连接到一个NSKeyedArchiver对象
NSKeyedArchiver *archiver = [[[NSKeyedArchiver alloc] initForWritingWithMutableData:data] autorelease];
// 开始存档对象,存档的数据都会存储到NSMutableData中
[archiver encodeObject:person1 forKey:@"person1"];
[archiver encodeObject:person2 forKey:@"person2"];
// 存档完毕(一定要调用这个方法)
[archiver finishEncoding];
// 将存档的数据写入文件
[data writeToFile:path atomically:YES];

2)NSData-从同一文件中恢复2个Person对象

恢复(解码)

// 从文件中读取数据
NSData *data = [NSData dataWithContentsOfFile:path];
// 根据数据,解析成一个NSKeyedUnarchiver对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person1 = [unarchiver decodeObjectForKey:@"person1"];
Person *person2 = [unarchiver decodeObjectForKey:@"person2"];
// 恢复完毕
[unarchiver finishDecoding];

3)利用归档实现深复制
比如对一个Person对象进行深复制

// 临时存储person1的数据
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person1];
// 解析data,生成一个新的Person对象
Student *person2 = [NSKeyedUnarchiver unarchiveObjectWithData:data];
// 分别打印内存地址
NSLog(@"person1:0x%x", person1); // person1:0x7177a60
NSLog(@"person2:0x%x", person2); // person2:0x7177cf0



归档:
存储自定义对象

    Person *p = [[Person alloc] init];
    p.age = 18;
    p.name = @"a";
    // 获取tem文件夹路径
    NSString *tempPath = NSTemporaryDirectory();
    // 拼接文件名
   NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
    // NSKeyedArchiver专门用来做自定义对象归档
    [NSKeyedArchiver archiveRootObject:p toFile:filePath];



在person.m

// 什么时候调用:当一个对象要归档的时候就会调用这个方法归档
// 作用:告诉苹果当前对象中哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeInt:_age forKey:@"age"];
}

解档:

    // 获取tem文件夹路径
    NSString *tempPath = NSTemporaryDirectory();

    // 拼接文件名
    NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
   // 解档
   Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];


什么时候调用:当一个对象要解档的时候就会调用这个方法解档

// 作用:告诉苹果当前对象中哪些属性需要解档
// initWithCoder什么时候调用:只要解析一个文件的时候就会调用
- (id)initWithCoder:(NSCoder *)aDecoder
{
    #warning  [super initWithCoder]
    // 这里不能用[super initWithCoder],什么时候调用[super initWithCoder:aDecoder]:只要父类遵守了NSCoding协议,就调用
    if (self = [super init]) {
        // 解档
        // 注意一定要记得给成员属性赋值
      _name = [aDecoder decodeObjectForKey:@"name"];
      _age = [aDecoder decodeIntForKey:@"age"];
    }
    return self;
}

总结

1、数据存储(数据持久化)

2、plist存储

把一些系统自带的OC对象生成pilst文件存储起来。

3、偏好设置

4、自定义对象归档(归档:数据存储)

上一篇下一篇

猜你喜欢

热点阅读