UI-senior(数据本地化-如何将复杂对象写入本地)

首先说明归解档是一种编码方式,不是数据本地化的方式,在复杂对象写入本地的时候实际上使用的还是writeToFile 的简单写入本地的方法,且WtiteToFile 直接写入本地,是整存整取的 在一个路径下存数据,最后一次存进去的东西会覆盖掉之前的,下面我们通过上述两内容实现复杂对象的写入.
本文内容:
一.对Foundation框架中的对象进行归档
二.对自定义的对象进行归档
三.对自定义内容进行归档
注意: 归档生成的文件是加密文件(是不可解)

首先创建一个person类

Person.h文件

@interface Person : NSObject<NScoding>
//如果一个对象想实现直接写入本地,那么这个对象就要遵守<NSCoding>协议

//声明属性
@property(nonatomic,copy)NSString *name;

@property(nonatomic,copy)NSString *sex;

@property(nonatomic,assign)NSUInteger age;

@end```

###Person.m文件
```code
#import "Person.h"
@implementation Person

//在归档和解档的时候,要把所有的属性都进行归解档
//归档
-(void)encodeWithCoder:(NSCoder *)aCoder{

  [aCoder encodeObject:self.name forKey:@"name"];

  [aCoder encodeObject:self.sex forKey:@"sex"];

  [aCoder encodeInteger:self.age forKey:@"age"];

}

//解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
  self = [super init];

   if (self) {

      self.name = [aDecoder decodeObjectForKey:@"name"];

      self.sex = [aDecoder decodeObjectForKey:@"sex"];

      self.age = [aDecoder decodeIntegerForKey:@"age"];

  }

return self;

}
@end```


然后在视图控制器ViewController中操作
###ViewController.m 文件中
```code
#import "ViewController.h"

#import "Person.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

[super viewDidLoad];

//如果一个对象想直接写入本地,那么这个对象就要遵守NSCoding协议,上面已经说过,一定记住哦

//获取要存储数据的主路经(具体参数前面有解释)
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

//创建Person对象,做存储的数据
Person *person = [[Person alloc] init];
person.name = @"班长";
person.sex = @"女";
person.age = 10;

#pragma mark-----对自定义对象进行归档和反归档----
//第一步:创建一个NSMutableData 用于初始化归档工具
NSMutableData *data = [NSMutableData data];

//第二步:创建一个归档工具
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

//第三步:使用归档工具 对需要归档的对象进行归档
[keyedArchiver encodeObject:person forKey:@"person"];

NSLog(@"---%@",data);

//第四步:结束归档(只有在结束归档之后数据才能得到有效保存)
[keyedArchiver finishEncoding];

NSLog(@"---%@",data);

//写入文件(确定具体的文件)
NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"data.plist"];

//写入文件(写入)
[data writeToFile:dataPath atomically:YES];

NSLog(@"%@",documentPathStr);

#pragma mark-----解档---
//第一步:从本地获取到的Data
NSData *newData = [NSData dataWithContentsOfFile:dataPath];
NSLog(@"newData = %@",newData);

//第二步:通过获取到的data,创建解档工具
NSKeyedUnarchiver *keyedUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:newData];

//第三步:创建一个person对象,接收解档结果
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];

//第四步:结束解档
[keyedUnarchiver finishDecoding];
NSLog(@"person =====%@",newPerson.name);


//对Foundation框架中的对象进行归档和反归档
[self  foundationClass]

//对自定义内容进行归档和反归档
[self  customContent]

}

#pragma mark ------- 对Foundation框架中的对象进行归档和反归档 --------
- (void)foundationClass{
//归档(以数组为例说明)
    //1. 创建路径
    NSString *document = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    
    //2. 拼接一个文件
    NSString *filePath = [document stringByAppendingString:@"/file.plist"];
    
    //3. 创建归档对象
    NSArray *array = @[@"C", @"OC", @"UI"];
    
    //4. 归档
    //archiveRootObject: 对基本数据类型数据进行归档的方法
    BOOL result = [NSKeyedArchiver archiveRootObject:array toFile:filePath];
    
    if (result) {
        
        NSLog(@"array归档成功:%@", filePath);
    }
    
    //5. 不需要结束
    
//反归档
    //1. 创建对象用来接收
    NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"解档结果 = %@", newArray);
    
    
}

#pragma mark ------- 对自定义内容进行归档和反归档 --------
- (void)customContent{
//归档
    //1. 获取路径
    NSString *custonPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)firstObject];
    custonPath = [custonPath stringByAppendingString:@"/customFile"];
    
    //2. 使用Data对象存放归档数据
    NSMutableData *data = [NSMutableData data];
    
    //3. 创建归档对象
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    
    //4. 对自定义内容进行归档
    [archiver encodeObject:@"尼古拉斯.赵四" forKey:@"name"];
    [archiver encodeObject:@"男" forKey:@"gender"];
    [archiver encodeInt:22 forKey:@"age"];
    
    [archiver encodeObject:@[@"AAAA", @"BBBB", @"CCCC"] forKey:@"array"];
    
    //5. 完成归档
    [archiver finishEncoding];
    
    //6. 写入本地
    BOOL result = [data writeToFile:custonPath atomically:YES];
    if (result) {
        NSLog(@"写入成功: %@", custonPath);
    }
 
#warning <#message#>
//反归档:
    
    //1. 读取文件, 转化成NSData对象类型
    NSData *unarchiverData = [NSData dataWithContentsOfFile:custonPath];
   
    //2. 创建反归档对象
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:unarchiverData];
  
    //3. 反归档(根据KEY值访问)
    NSString *str = [unArchiver decodeObjectForKey:@"name"];
    
    NSLog(@"%@", str);
}

@end```
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,264评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,549评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,389评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,616评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,461评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,351评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,776评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,414评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,722评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,760评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,537评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,381评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,787评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,030评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,304评论 1 252
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,734评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,943评论 2 336

推荐阅读更多精彩内容

  • 沙盒 Plist Preference偏好设置 NSKeyedArchiver归档 / NSKeyedUnarch...
    追风者366阅读 3,314评论 0 6
  • 下面是我最近两年学习OC中的一些基础知识,对于学习OC基础知识的人可能有些帮助,拿出来分享一下,还是那句话不喜勿喷...
    小小赵纸农阅读 2,549评论 1 7
  • 27、ViewController的didReceiveMemoryWarning是在什么时候调用的?默认的操作是...
    烟雨平生花飞舞阅读 548评论 0 1
  • 一、数据持久化概述 数据持久化就是数据的永久存储。其本质是将数据保存为文件,存到程序的沙盒中。 1、数据持久化的方...
    lilinjianshu阅读 475评论 0 1
  • 有兔一枚,名叫滴滴。 静若处子,动如脱兔。这句话真是逼真至极。 滴滴被抱着的时候,几乎可以算是废了,怎么蹂躏都可以...
    兔小四阅读 210评论 0 0