• 持久化存储——偏好设置,plist,归档---学习笔记二


    //一. 本地持久化
    
        //1.沙盒
    
       //1.1 应用程序包:存放的是应用程序的源文件,包括资源文件和可执行文件
    
        NSString *path = [[NSBundle mainBundle]bundlePath];
    
        
    
       //1.2 Documents:最常用的目录,iTunes同步该应用时会同步此文件夹中的内容,适合存储重要数据
    
        
    
        NSString *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES).firstObject;
    
        //1.3 Library
    
       //1.3.1  Caches:iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。
    
        
    
        NSString *cachs = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
    
        
    
       //1.4 Preferences:iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。
    
      //1.5 tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除。
    
       NSString *tmpPath = NSTemporaryDirectory();
    
        
    
     //---打印的地址,前往->前往文件夹->输入//Users/xingzai/Library/Developer 就可以进入到当前文件夹下
    
      //二 . Plist 存储
    
      //2.1 plist文件是将某些特定的类,通过XML文件的方式保存在目录中。
    
        //可以被序列化的类型只有如下几种
    
       //-----根目录
    
        //NSArray;//数组
    
        //NSDictionary;//字典
    
      //-----子属性
    
        //NSArray;//数组
    
        //NSDictionary;//字典
    
    //    NSMutableArray;//可变数组
    
    //    NSMutableDictionary;//可变字典
    
    //    NSData;//二进制数据
    
    //    NSMutableData;//可变二进制数据
    
    //    NSString;//字符串
    
    //    NSMutableString;//可变字符串
    
    //    NSNumber;//基本数据
    
    //    NSDate;//日期
    
        
    
       //2.2 下面以数组为例
    
        //2.2.1存储
    
        NSString *plistPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    
        NSArray *arr = @[@{@"1":@"num"},@{@"2":@"num"},@{@"3":@"num"},@{@"4":@"num"},@{@"5":@"num"}];
    
      //stringByAppendingPathComponent是到目录下/,如a/
    
        [arr writeToFile:[plistPath stringByAppendingPathComponent:@"1.plist"] atomically:YES];
    
        //stringByAppendingString 是和当前目录平级的,和a共处一个目录里
    
    //    [arr writeToFile:[plistPath stringByAppendingString:@"1.plist"] atomically:YES];
    
        
    
        
    
        //2.2.2 取
    
        NSArray *contentArray = [NSArray arrayWithContentsOfFile:[plistPath stringByAppendingPathComponent:@"1.plist"]];
    
        NSLog(@"%@",contentArray);
    
       
    
        //三. Preference(偏好设置)
    
    //    偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
    
    //    偏好设置是以key-value的方式进行存储和读写,使用到一个单例对象NSUserDefaults
    
        //
    
        NSUserDefaults *keyDefault = [NSUserDefaults standardUserDefaults];
    
         [keyDefault setObject:@"xingZai" forKey:@"name"];
    
        [keyDefault setBool:YES forKey:@"sex"];
    
        [keyDefault setInteger:30 forKey:@"age"];
    
        //立即同步
    
        [keyDefault synchronize];
    
        //
    
        
    
        NSString *name = [keyDefault objectForKey:@"name"];
    
        NSInteger age = [keyDefault integerForKey:@"age"];
    
        BOOL sex = [keyDefault boolForKey:@"sex"];
    
        //oc 的BOOL用%d表示,c的bool用%s表示,
    
        NSLog(@"name = %@ age =%ld sex=%d",name,age,sex);
    
        
    
        
    
        
    
    //    如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
    
    //    偏好设置会将所有数据保存到同一个文件中,使用同一个key进行存储数据,会覆盖之前存储的数据。
    
        //四 、归档与解档
    
    //    归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于绝大多数支持存储数据的类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
    
        
    
    //    1. 遵循NSCoding协议
    
    //    NSCoding协议声明了两个方法,这两个方法都是必须实现的:
    
    //    encodeWithCoder:用来说明如何将对象编码到归档中。
    
    //    initWithCoder:用来说明如何进行解档来获取一个新对象。
    
        
    
    //    @interface Student : NSObject<NSCoding>
    
    //    
    
    //    @property (nonatomic, copy) NSString *name; //名字
    
    //    @property (nonatomic, assign) BOOL sex; //性别,NO 为女,YES为男
    
    //    @property (nonatomic, assign) NSInteger age; //年龄
    
    //    
    
    //    
    
    //    @end
    
        
    
    //#import "Student.h"
    
    //    
    
    //    @implementation Student
    
    //    
    
    //    //解档 ( decoder 解码器;译码员)
    
    //    - (instancetype)initWithCoder:(NSCoder *)aDecoder{
    
    //        
    
    //        if (self = [super init]) {
    
    //            self.name = [aDecoder decodeObjectForKey:@"name"];
    
    //            self.sex = [aDecoder decodeBoolForKey:@"sex"];
    
    //            self.age = [aDecoder decodeIntegerForKey:@"age"];
    
    //        }
    
    //        return self;
    
    //    }
    
    //    //归档 (aCoder 归档)
    
    //    - (void)encodeWithCoder:(NSCoder *)aCoder{
    
    //        [aCoder encodeObject:self.name forKey:@"name"];
    
    //        [aCoder encodeBool:self.sex forKey:@"sex"];
    
    //        [aCoder encodeInteger:self.age forKey:@"age"];
    
    //    }
    
    //    @end
    
        
    
        //2. NSKeyedArchiver归档
    
    //    调用NSKeyedArchiver的archiveRootObject:toFile:方法把对象归档
    
        NSString *keyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    
        NSString *file = [keyPath stringByAppendingPathComponent:@"student.data"];
    
        
    
        Student *student = [[Student alloc] init];
    
        student.name = @"五宝";
    
        student.sex = YES;
    
        student.age = 22;
    
        BOOL isSuccess = [NSKeyedArchiver archiveRootObject:student toFile:file];
    
        if (isSuccess) {
    
            NSLog(@"写入成功");
    
        }
    
        
    
        //3. NSKeyedUnarchiver 解档
    
      // 调用 NSKeyedUnarchiver unarchiveObjectWithData: 取出相应的数据
    
        NSString *unkeyPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
    
        NSString *unfile = [unkeyPath stringByAppendingPathComponent:@"student.data"];
    
        Student *unStudent = [NSKeyedUnarchiver unarchiveObjectWithFile:unfile];
    
        if (unStudent) {
    
            self.students = unStudent;
    
    //        self.students.name = unStudent.name;
    
    //        self.students.sex = unStudent.sex;
    
    //        self.students.age = unStudent.age;
    
            
    
            NSLog(@"unStudent:name=%@ sex=%d age=%ld",self.students.name,self.students.sex,self.students.age);
    
        }
    
     
    将来的自己,会感谢现在不放弃的自己!
  • 相关阅读:
    网课必备,自动入会
    大数据分析 RDD 实训作业
    Mysql基础
    Redis 中 scan 命令太坑了,千万别乱用!!
    SD/XOI 2022 多边形
    SQL查询 相同部门 中 年龄最大的 员工信息(A元素相同,查询B元素最大的数据)
    【教程】fastjson升级,spring boot设置fastjson2做序列化反序列化
    02Web服务器 和 应用服务器
    www
    01从软、硬 两个层面理解何为服务器?
  • 原文地址:https://www.cnblogs.com/TheYouth/p/5827402.html
Copyright © 2020-2023  润新知