美文网首页码农的日常之iOS开发
iOS数据存储的常用方式

iOS数据存储的常用方式

作者: CoderShmily | 来源:发表于2015-09-17 10:28 被阅读400次

    iOS数据存储的常用方式

    • 属性列表(plist)归档
    • Preference(偏好设置)
    • NSKeyedArchiver归档(NSCoding)
    • SQLite3
    • Core Data

    plist存储

    什么时候使用plist存储:字典或者数组
    plist不能存储自定义对象

    - (IBAction)save:(id)sender {
        Person *p = [[Person alloc] init];
    
        // 假设存储数组,存储应用沙盒
        // 文件保存到文件夹
        NSArray *users = @[p,@"332"];
    
        // directory:获取哪个文件夹 NSCachesDirectory,搜索caches文件
        // domainMask:获取哪个范围下文件夹 NSUserDomainMask,表示在当前用户下去搜索
        // expandTilde:是否展开全路径
        // ~/Library/Caches
        //获取Caches文件夹的路径
        NSString *cachesPath =  NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
    
        // 拼接文件路径
        NSString *filePath = [cachesPath stringByAppendingPathComponent:@"user.plist"];
    
    
        NSLog(@"%@",cachesPath);
    
        // File文件全路 径
        [users writeToFile:filePath atomically:YES];
    
    }
    - (IBAction)read:(id)sender {
        // plist读取:之前是对象怎么存的,读取出来也是什么数组
        NSString *cachesPath =  NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    
        // 拼接文件路径
        NSString *filePath = [cachesPath stringByAppendingPathComponent:@"user.plist"];
        NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
    
    }
    
    

    偏好设置存储

    • 偏好设置存储NSUserDefaults用来专门做偏好设置存储

    • 偏好设置存储优点:

      1. 不需要关心文件名,系统会自动帮你生成一个文件名
      2. 快速做键值对的存储
    • 读取代码

    - (IBAction)save:(id)sender {
    
         [[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:@"account"];
         [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"autoLogin"];
    }
    - (IBAction)read:(id)sender {
    
       NSString *str = [[NSUserDefaults standardUserDefaults] objectForKey:@"account"];
       BOOL autoLogin = [[NSUserDefaults standardUserDefaults] boolForKey:@"autoLogin"];
        NSLog(@"%d",autoLogin);
    }
    

    归档

    归档:自定义对象想要存储到沙盒(文件夹),必须通过归档。

    自定义对象要归档,必须要遵守NSCoding协议

    - (IBAction)save:(id)sender {
    
        Person *person = [[Person alloc] init];
        person.age = 10;
        person.name = @"adas";
        // 获取temp文件夹路径
        NSString *tempPath = NSTemporaryDirectory();
    
        // 获取Document文件夹路径
    //    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    
        // 拼接文件全路径
        NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
    
        // 归档的时候让person对象调用encodeWithCoder
        // 传入多个参数,可以传入数组
        [NSKeyedArchiver archiveRootObject:person toFile:filePath];
    
    
    }
    - (IBAction)read:(id)sender {
        // 获取temp文件夹路径
        NSString *tempPath = NSTemporaryDirectory();
    
        // 获取Document文件夹路径
        //    NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    
        // 拼接文件全路径
        NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
       Person *p =  [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    
        NSLog(@"%@",p.name);
    }
    
    

    Person类实现

    //  Person.h
    #import <Foundation/Foundation.h>
    @interface Person : NSObject<NSCoding>
    
    @property (nonatomic, assign) int age;
    @property (nonatomic, strong) NSString *name;
    
    @end
    
    //  Person.m
    #import "Person.h"
    
    // 自定义对象要归档,必须要遵守NSCoding协议
    @implementation Person
    
    // 什么时候调用:当自定义对象归档的时候调用
    // 作用:告诉系统当前对象哪些属性需要归档
    - (void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:_name forKey:@"name"];
    
        [aCoder encodeInt:_age forKey:@"age"];
    }
    
    // init初始化方法,先要初始化父类
    // 什么时候调用:当自定义对象解档的时候调用
    // 作用:告诉系统当前对象哪些属性需要解档
    
    // 当解析一个文件的时候,就会调用initWithCoder
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
    #warning 什么时候调用initWithCoder初始化父类
        if (self = [super init]) {
    
            // 解档属性
            // 解档属性一定要记得保存到成员属性里
          _name = [aDecoder decodeObjectForKey:@"name"];
    
            _age = [aDecoder decodeIntForKey:@"age"];
    
        }
        return self;
    }
    
    @end
    

    initWithCoder补充

    #import "RedView.h"
    // @interface RedView : UIView
    
    @implementation RedView
    
    // 解档:肯定会调用对象initWithCoder:,做父类的初始化操作
    // 什么时候调用[super initWithCoder:aDecoder]:只要父类遵守了NSCoding协议,就需要调用
    
    - (id)initWithCoder:(NSCoder *)aDecoder
    {
        // super -> UIView
        if (self = [super initWithCoder:aDecoder]) {
            NSLog(@"%s",__func__);
        }
        return self;
    }
    @end
    

    相关文章

      网友评论

        本文标题:iOS数据存储的常用方式

        本文链接:https://www.haomeiwen.com/subject/jvjbcttx.html