美文网首页
iOS中的数据存储

iOS中的数据存储

作者: imChay | 来源:发表于2017-10-13 15:33 被阅读12次
    • 应用沙盒
    • 归档
    • 偏好设置
    • Plist

    应用沙盒

    Documents
    Library -- Caches
            -- Preferences
    tmp
    

    归档

    Person.h

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject <NSCoding>
    
    /** 姓名 */
    @property(nonatomic,copy) NSString* name;
    /** 昵称 */
    @property(nonatomic,copy) NSString* nickName;
    
    @end
    
    

    Person.m

    #import "Person.h"
    
    @implementation Person
    
    // 归档:只要一个自定义对象归档的时候就会调用,告诉系统 哪些属性需要归档
    - (void)encodeWithCoder:(NSCoder *)coder
    {
        [coder encodeObject:_name forKey:@"name"]; // 给属性设置一个key
        [coder encodeObject:_nickName forKey:@"nickName"];
    }
    
    
    //解档:只要一个自定义对象解档的时候就会调用,告诉系统 解析key得到的值,赋值给哪个属性
    - (id)initWithCoder:(NSCoder *)aDecoder{
    //    什么时候调用 [super initWithCoder]
        if (self = [super init]) {
            _name = [aDecoder decodeObjectForKey:@"name"];
            _nickName = [aDecoder decodeObjectForKey:@"nickName"];
        }
        return self;
    }
    
    @end
    

    ViewController.m

    #import "ViewController.h"
    #import "Person.h"
    //---------------思路----------------
    //1、创建自定义对象
    //   重写encodeWithCoder 归档
    //   initWithCoder方法  解档
    //2、创建路径  /caches
    //3、使用归档类方法进行存储
    //   使用解档类方法进行解档
    //-----------------------------------
    
    @interface ViewController ()
    
    - (IBAction)save:(id)sender;
    - (IBAction)read:(id)sender;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)save:(id)sender {
    //    1、创建对象
        Person *p = [[Person alloc] init];
        p.name = @"李明";
        p.nickName = @"hahaha";
        
    //    2.1、创建路径/tmp,使用函数
        NSString *cachesPath = NSTemporaryDirectory();
    //    2.2、拼接路径;扩展名随意写,苹果对内容进行了加密
        NSString *path = [cachesPath stringByAppendingString:@"person.data"];
        
    //    3、使用归档类方法进行存储
        [NSKeyedArchiver archiveRootObject:p toFile:path];
    }
    
    - (IBAction)read:(id)sender {
        
        NSString *cachesPath = NSTemporaryDirectory();
        NSString *path = [cachesPath stringByAppendingString:@"person.data"];
        
        Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        NSLog(@"%@,%@",p.name,p.nickName);
    }
    @end
    

    归档:什么时候调用super initWithCoder

    #import "MyView.h"
    @implementation MyView
    
    // 解析文件的时候调用
    // 作用:解析xib,storyboard调用
    // 可以猜测 我们平时在storyboard中拖动的控件,是通过归档存储的,当创建的时候就解析 归档文件 然后实例化
    - (id)initWithCoder:(NSCoder *)aDecoder{
        // 这里必须调用[super initWithCoder:aDecoder],super ->UIView
        // 什么时候调用[super initWithCoder:aDecoder],只要父类遵守了NSCoding协议,就调用[super initWithCoder:aDecoder]
        if(self = [super initWithCoder:aDecoder])
        {
            NSLog(@"调用了initWithCoder");
        }
        return self;
    }
    
    @end
    

    偏好设置

    #import "ViewController.h"
    
    @interface ViewController ()
    
    - (IBAction)save:(id)sender;
    - (IBAction)read:(id)sender;
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)save:(id)sender {
    //    /Library/Preferences
    //    获取单例对象
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        [userDefaults setValue:@"YChiong" forKey:@"name"];
        [userDefaults setObject:@"xmg" forKey:@"address"];
        [userDefaults setBool:YES forKey:@"isHandSome"];
        [userDefaults setInteger:25 forKey:@"age"];
    }
    
    - (IBAction)read:(id)sender {
        //    获取单例对象
        NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
        
        NSString *name = [userDefaults valueForKey:@"name"];
        NSString *address = [userDefaults objectForKey:@"address"];
        BOOL isHandSome = [userDefaults boolForKey:@"isHandSome"];
        NSInteger age = [userDefaults integerForKey:@"age"];
        
        NSLog(@"%@,%@,%i,%i",name,address,isHandSome,age);
    }
    @end
    

    Plist

    #import "ViewController.h"
    
    @interface ViewController ()
    - (IBAction)save:(id)sender;
    - (IBAction)read:(id)sender;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    }
    
    - (IBAction)save:(id)sender {
    //    1、创建数组或者字典
        NSArray *arr = @[@"YChiong",@25];
    //    2、创建存储路径
    //    2.1  /Library/Caches文件夹
    //    参数:
    //    NSSearchPathDirectory directory:获取哪个文件夹
    //    NSSearchPathDomainMask domainMask:在哪个范围下获取 NSUserDomainMask:在用户的范围内搜索?
    //    BOOL expandTilde:expandTilde是否展开全路径,YES:展开
    //    返回值:一个数组
        NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
    //    2.2 拼接路径
        NSString *plistPath = [cachePath stringByAppendingPathComponent:@"YChiong.plist"];
        
    //    3、存储数组/字典 到 指定路径
        [arr writeToFile:plistPath atomically:YES];
    }
    
    - (IBAction)read:(id)sender {
    //    怎么存,就怎么取
        NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
        NSString *plistPath = [cachePath stringByAppendingPathComponent:@"YChiong.plist"];
        
        NSArray *arr = [NSArray arrayWithContentsOfFile:plistPath];
        NSLog(@"%@",arr);
    }
    @end
    

    相关文章

      网友评论

          本文标题:iOS中的数据存储

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