• UISenior之数据的本地化持久化


    数据的本地化主要分为两个方面:1.简单数据的本地持久化(NSString、NSArray、NSDictionary、NSData)2.复杂数据的本地持久化(本文以Person类为例)

    简单对象的本地化:

    简单对象的本地化基本可以分为四步:

    第一步:找到Documents的文件夹的路径。

    第二步:我们要知道存储什么,所以要创建存储的对象

    第三步:需要知道字符串最终的存储的地方,所以需要创建一个路径去存储字符串

    第四步:准备工作完成,将字符串写入文件

    下面具体实现上述四步:

    第一步

     
    1. //    第一步:需要知道这个对象存在哪里,所以需要一个文件夹的路径  
    2. //    找到Documents文件夹路径    
    3. NSString *documents = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  

    第二步

     
    1. //    第二步:我们知道要存储什么?所以需要创建什么  
    2. //    创建要存储的内容:字符串  
    3.     NSString *str = @"AJAR";  

    第三步

     
    1. //    第三步:需要知道字符串最终存储的地方,所以需要创建一个路径去存储字符串  
    2.     NSString *strPath = [documents stringByAppendingPathComponent:@"zhy.txt"];  


    第四步

    1. <span style="color:#000000;">//    第四步:准备工作完成,将字符串写入文件  
    2. //    第一个参数:写入的文件的一个路径  
    3. //    第二个参数:在断电的情况下,会不会自动保存  
    4. //    第三个参数:编码格式  
    5. //    第四个参数:错误信息  
    6.     [str writeToFile:strPath atomically:YES encoding:NSUTF8StringEncoding error:nil];  
    7.     NSLog(@"strPath = %@", strPath);</span>  

    将NSString文件夹存储的内容取出

    1. //    将字符串取出:使用stringWithContentsOfFile这个方法将其取出  
    2. //    第一个参数:字符串存储的路径  
    3. //    第二个参数:编码格式  
    4. //    第三个参数:错误信息  
    5.     NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncoding error:nil];  
    6.     NSLog(@"newStr = %@", newStr);  


    复杂对象的本地化:

    复杂对象的本地化最重要的两步就是归档和解档

    本文以Person对象为例,首先创建Person类继承于NSObject

    Person.h文件

     
    1. ///姓名  
    2. @property(nonatomic, copy)NSString *name;  
    3.   
    4. ///性别  
    5. @property(nonatomic, copy)NSString *gender;  
    6.   
    7. ///年龄  
    8. @property(nonatomic, assign)NSInteger age;  


    Person.m文件中 需要重写归档和解档的方法

    1. //归档  
    2. //将所有的属性进行归档  
    3. -(void)encodeWithCoder:(NSCoder *)aCoder {  
    4.     [aCoder encodeObject:self.name forKey:@"name"];  
    5.     [aCoder encodeObject:self.gender forKey:@"gender"];  
    6.     [aCoder encodeInteger:self.age forKey:@"age"];  
    7. }  
    8.   
    9. //解档(反归档)  
    10. - (instancetype)initWithCoder:(NSCoder *)aDecoder {  
    11.     self = [super init];  
    12.     if (self) {  
    13.         self.name = [aDecoder decodeObjectForKey:@"name"];  
    14.         self.gender = [aDecoder decodeObjectForKey:@"gender"];  
    15.         self.age = [aDecoder decodeIntegerForKey:@"age"];  
    16.     }  
    17.     return self;  
    18. }  


    在ViewController里对Person对象进行操作

    找到Documents文件夹的目录

    1. NSString *documentPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];  

    创建Person对象

     
    1. <span style="font-size:14px;">    Person *per = [[Person alloc] init];  
    2.     per.name = @"MBboy";  
    3.     per.gender = @"boy";  
    4.     per.age = 18;</span>  


    把这个复杂对象归档

    1. //   创建NSMutableData,用于创建初始化归档工具的  
    2.     NSMutableData *data = [NSMutableData data];  
    3.     NSLog(@"======data = %@====", data);  
    4. //   创建归档工具  
    5.     NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];  
    6. //   对要归档的person对象进行归档  
    7.     [archiver encodeObject:per forKey:@"person"];  
    8. //   结束归档  
    9.     [archiver finishEncoding];  
    10.     NSLog(@"======data = %@====", data);  
    11.     


    将归档的内容NSMutableData存储在本地


     
    1. NSString *personPath = [documentPath stringByAppendingPathComponent:@"person.plist"];  

    写入

    1. [data writeToFile:personPath atomically:YES];  
    2. NSLog(@"personPath = %@", personPath);  


    解档

    将要解档的数据找出来

    1. NSData *resultData = [NSData dataWithContentsOfFile:personPath];  
    2. NSLog(@"resultData = %@", resultData);  

    创建解档工具

    1. NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:resultData];  

    对person对象进行解档[使用对象接收]

    1. Person *newPer = [unarchiver decodeObjectForKey:@"person"];  

    结束解档

      1. [unarchiver finishDecoding];  
      2. NSLog(@"name = %@ gender = %@ age = %ld", newPer.name, newPer.gender, newPer.age); 
  • 相关阅读:
    深拷贝的终极探索(90%的人都不知道)
    VS Code:让你工作效率翻倍的23个插件和23个编辑技巧
    Git使用教程:最详细、最傻瓜、最浅显、真正手把手教!
    【译】使用 ndb 调试 node 应用
    nodejs的express使用介绍
    Koa 框架教程
    VSCode配置Git随记
    单页面路由原理及实现
    可能比文档还详细--VueRouter完全指北
    急速JavaScript全栈教程
  • 原文地址:https://www.cnblogs.com/zhun/p/5468511.html
Copyright © 2020-2023  润新知