数据的本地化主要分为两个方面: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. @property(nonatomic, copy)NSString *gender;
  5. ///年龄
  6. @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. - (instancetype)initWithCoder:(NSCoder *)aDecoder {
  10. self = [super init];
  11. if (self) {
  12. self.name = [aDecoder decodeObjectForKey:@"name"];
  13. self.gender = [aDecoder decodeObjectForKey:@"gender"];
  14. self.age = [aDecoder decodeIntegerForKey:@"age"];
  15. }
  16. return self;
  17. }

在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);

将归档的内容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);

UISenior之数据的本地化持久化的更多相关文章

  1. Perl数据序列化和持久化(入门):Storable模块

    Perl提供了一个Storable模块,用来对数据结构进行序列化(serialization,Perl中称为冻结),也就是将数据结构保存为二进制数据. 序列化后的数据可以写入文件实现持久化,可以将持久 ...

  2. 在nodejs使用Redis缓存和查询数据及Session持久化(Express)

    在nodejs使用Redis缓存和查询数据及Session持久化(Express) https://segmentfault.com/a/1190000002488971

  3. 在这个应用中,我使用了 MQ 来处理异步流程、Redis 缓存热点数据、MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ、MySQL 持久化的数据也会存在于一个分布式文件系统中,他们之间的调用也是需要用 RPC 来完成数据交互的。

    在这个应用中,我使用了 MQ 来处理异步流程.Redis 缓存热点数据.MySQL 持久化数据,还有就是在系统中调用另外一个业务系统的接口,对我的应用来说这些都是属于 RPC 调用,而 MQ.MySQ ...

  4. Android基础总结(5)——数据存储,持久化技术

    瞬时数据:指那些存储在内存当中,有可能会因为程序广播或其他原因导致内存被回收而丢失的数据. 数据持久化:指将那些内存中的瞬时数据保存到存储设备中,保证即使在手机或电脑关机的情况下,这些数据仍然不丢失. ...

  5. [转]在nodejs使用Redis缓存和查询数据及Session持久化(Express)

    本文转自:https://blog.csdn.net/wellway/article/details/76176760 在之前的这篇文章 在ExpressJS(NodeJS)中设置二级域名跨域共享Co ...

  6. Android学习之基础知识九 — 数据存储(持久化技术)之SQLite数据库存储

    前面一讲介绍了数据持久化技术的前两种:文件存储.SharedPreferences存储.下面介绍第三种技术:SQLite数据库存储 一.SQLite数据库存储 SQLite数据库是一款轻量级的关系型数 ...

  7. Android学习之基础知识九—数据存储(持久化技术)

    数据持久化是将那些内存中的瞬时数据保存到存储设备,保证即使在手机或电脑关机的情况下,这些数据仍然不会丢失. Android系统中主要提供了3种方式用于简单地实现数据持久化功能:文件存储.SharedP ...

  8. 基于ActiveMQ的Topic的数据同步——消费者持久化

    前面一章中介绍了activemq的初步实现:基于ActiveMQ的Topic的数据同步——初步实现 下面来解决持久化订阅的问题: (1)使用queue,即队列时,每个消息只有一个消费者,所以,持久化很 ...

  9. docker数据卷之持久化操作

    docker Docker三大核心组件:(运行起来的镜像就可以称作容器) Docker 镜像--Dcoker images:类比与类 Docker 仓库--Docker registeries: Do ...

随机推荐

  1. 存储过程中“Select Top 变量”的问题如何解决

    在SqlServer2005中,可以这样: DECLARE @p int SELECT TOP (@p) * FROM 表名 在SqlServer2000中,不支持以上方法,可以这样: DECLARE ...

  2. [HDU 5029] Relief grain

    Relief grain Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 100000/100000 K (Java/Others)T ...

  3. Guid 的几种形式

    Guid.NewGuid().ToString()得几种格式显示 1.Guid.NewGuid().ToString("N") 结果为:       38bddf48f43c485 ...

  4. keychain中我的证书与证书, p12与pem, apns, 推送

    如果在A电脑上生成 的apns, 到B电脑上导入此文件时, 在 "我的证书"中找不到, 要去"证书"才能找到, 因为 创建时的csr不是本机生成的. 那这样的话 ...

  5. spring--注解注入--12

    12.1  概述 12.1.1  什么是零配置 在SSH集成一章中大家注意到项目结构和包结构是不是很有规律,类库放到WEB-INF/lib文件夹下,jsp文件放到WEB-INF/jsp文件夹下,web ...

  6. POJ1456 Supermarket 贪心

    贪心策略:一定先卖价值最大的,然后考虑卖当前的物品,卖的日期越靠后,越优,可以为以后的物品提供机会 #include <stdio.h> #include <string.h> ...

  7. [转]ASP.NET MVC 入门1、简介

    什么是MVC模式 MVC(Model-View-Controller,模型—视图—控制器模式)用于表示一种软件架构模式.它把软件系统分为三个基本部分:模型(Model),视图(View)和控制器(Co ...

  8. 华为过滤字符串(java)

    /*通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉.比如字符串“abacacde”过滤结果为“abcde”.要求实现函 ...

  9. vijosP1371 方程的解

    vijosP1371 方程的解 链接:https://vijos.org/p/1371 [思路] 组合公式+快速幂+高精单精. 求x^x %1000:因为x最大为2^31-1所以用快速幂在O(logx ...

  10. Android 多线程 异步加载

    Android 应用中需要显示网络图片时,图片的加载过程较为耗时,因此加载过程使用线程池进行管理, 同时使用本地缓存保存图片(当来回滚动ListView时,调用缓存的图片),这样加载和显示图片较为友好 ...