zoukankan      html  css  js  c++  java
  • iOS 应用数据存储的常用方式

    iOS 开发中,经常会有将数据存储到本地的需求。比如一些数据的缓存,或者记录下用户的账号密码,记录下下次是否自动登录等,这些都需要将数据记录到本地。iOS中,数据存储到本地的常见方式有三种:

    一: 使用plist 存储到本地;

    二:Preference(偏好设置)

    三:归档解档。

    举例介绍一下三种方式。

    在介绍数据存储之前,需要先了解下iOS 中app的沙盒机制,详情见:http://www.cnblogs.com/acBool/p/5467060.html 。

    方式一:

    使用plist将数据存储到本地,实际上就是将数据写到一个文件中,文件中的数据是以xml格式保存。使用plist存储数据非常方便,代码如下:

    // 获得沙盒路径
        NSString *home = NSHomeDirectory();
        NSLog(@"home = %@",home);
        NSString *docPath = [home stringByAppendingPathComponent:@"Documents"];
        // 文件路径
        NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"];
        
        NSArray *data = @[@"test",@10,@"lalala"];
        [data writeToFile:filePath atomically:YES];

    从plist文件中读取所保存的数据代码如下:

        // 获得沙盒路径
        NSString *home = NSHomeDirectory();
        NSString *docPath = [home stringByAppendingPathComponent:@"Documents"];
        // 文件路径
        NSString *filePath = [docPath stringByAppendingPathComponent:@"data.plist"];
        NSArray *data = [NSArray arrayWithContentsOfFile:filePath];
        NSLog(@"%@",data);

    需要有一点注意的是:使用plist保存数据,仅适用于Foundation框架中自带的一些类,比如 NSStringNSArrayNSDictionary等。保存数据时,通过调用对象的writeToFile 方法写文件,读取数据时,通过调用对象的 ...WithContentsOfFile 方法读取文件内容。

    方式二:

    偏好设置的本质实际上仍然是以plist的方式存储数据。

    偏好设置保存数据代码:

    // 利用NSUserDefaults,就能直接访问软件的偏好设置(Library/Preferences)
        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        
        [defaults setObject:@"test" forKey:@"account"];
        [defaults setObject:@"121" forKey:@"password"];
        [defaults setInteger:10 forKey:@"age"];
        [defaults setBool:YES forKey:@"rember"];
        
        // 立刻同步,将内存信息同步到文件中
        [defaults synchronize];

    偏好设置读取数据代码:

        NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
        NSString *account = [defaults objectForKey:@"account"];
        NSInteger age = [defaults integerForKey:@"age"];
        BOOL rember = [defaults boolForKey:@"rember"];
        NSLog(@"%@  %ld  %d",account,age,rember);

    通过代码可以看出,偏好设置和plist的区别是,使用偏好设置保存数据,不需要获取目录和文件名。实际上,使用偏好设置保存数据时,不能够新建文件,只能保存到一个固定的文件中。

    另外,因为偏好设置的本质仍然是plist保存,因此还是只能保存Foundation框架中自带的类,还是有一定的局限性。

    方式三:

    归档解档。

    该方式能够将任何遵守了 NSCoding 协议的对象写入到文件中,且写入到文件中的数据是乱码,有一定的加密效果。

    实现NSCoding协议,需要实现 - (void)encoderWithCoder:(NSCoder *)encoder  和 - (id)initWithCoder:(NSCoder *)decoder 两个方法。

    示例如下:

    /**
     *  将某个对象写入文件时会调用
     *  在这个方法中说清楚哪些属性需要存储
     */
    - (void)encodeWithCoder:(NSCoder *)encoder
    {
        [encoder encodeObject:_name forKey:@"name"];
        [encoder encodeInteger:_age forKey:@"age"];
        [encoder encodeDouble:_height forKey:@"height"];
    }
    /**
     *  从文件中读取某个对象时调用
     *  在这个方法中说清楚属性应该如何获取
     */
    - (id)initWithCoder:(NSCoder *)decoder
    {
        if(self = [super init]){
            _name = [decoder decodeObjectForKey:@"name"];
            _age = [decoder decodeIntForKey:@"age"];
            _height = [decoder decodeDoubleForKey:@"height"];
        }
        return self;
    }

    对一个模型对象归档的代码:

    Persion *person = [[Persion alloc] init];
        person.name = @"test";
        person.age = 15;
        person.height = 1.70;
        
        // 归档模型对象
        NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
        NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];
        
        [NSKeyedArchiver archiveRootObject:person toFile:filePath];

    解档一个模型对象的方法:

    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject ];
        NSString *filePath = [doc stringByAppendingPathComponent:@"person.data"];
        
        Persion *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
        NSLog(@"%@   %d   %f",person.name,person.age,person.height);
  • 相关阅读:
    C#listbox使用方法
    poj 3894 System Engineer (二分图最大匹配--匈牙利算法)
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 连接字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 比较字符串
    Java实现 蓝桥杯VIP 算法训练 黑白无常
  • 原文地址:https://www.cnblogs.com/acBool/p/5470755.html
Copyright © 2011-2022 走看看