数据持久化基础知识——归档

使用对象模型进行归档,将对象写入文件,再从中读取它们。

1.首先的创建一个类,FourLines类.

FourLines.h

1 #import <Foundation/Foundation.h>
2
3 //数据模型,存储当前存储在属性列表应用的字典中的数据。
4 @interface FourLines : NSObject <NSCopying, NSCoding>
5 @property (copy, nonatomic) NSArray * lines;
6 @end

FourLines.m

 1 #import "FourLines.h"
 2
 3 static NSString * const kLinesKey = @"kLinesKey";
 4
 5 @implementation FourLines
 6
 7 #pragma mark - Coding
 8 //对4个属性进行解码
 9 - (id)initWithCoder:(NSCoder *)aDecoder
10 {
11     self = [super init];
12     if (self) {
13         self.lines = [aDecoder decodeObjectForKey:kLinesKey];
14     }
15     return self;
16 }
17 //对4个属性进行编码
18 - (void)encodeWithCoder:(NSCoder *)aCoder
19 {
20     [aCoder encodeObject:self.lines forKey:kLinesKey];
21 }
22
23 #pragma mark - Coping
24 //新建一个对象,将4个字符串复制到对象中。
25 - (id)copyWithZone:(NSZone *)zone
26 {
27     FourLines * copy = [[[self class] allocWithZone:zone] init];
28     NSMutableArray * linesCopy = [NSMutableArray array];
29     for (id line in self.lines) {
30         [linesCopy addObject:[line copyWithZone:zone]];
31     }
32     copy.lines = linesCopy;
33     return copy;
34 }
35 @end

ViewController.m

 1 #import "ViewController.h"
 2 #import "FourLines.h"
 3
 4 static NSString * const kRootKey = @"kRootKey";
 5
 6 @interface ViewController ()
 7 @property (strong, nonatomic) IBOutletCollection(UITextField) NSArray * lineFields;
 8 @end
 9
10 @implementation ViewController
11
12 - (void)viewDidLoad {
13     [super viewDidLoad];
14     NSString * filePath = [self dataFilePath];
15     if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
16
17 //        NSArray * array = [[NSArray alloc] initWithContentsOfFile:filePath];
18 //        for (int i = 0; i < 4; i++) {
19 //            UITextField * theField = self.lineFields[i];
20 //            theField.text = array[i];
21 //        }
22
23         NSData * data = [[NSMutableData alloc] initWithContentsOfFile:filePath];
24         NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
25         FourLines * fourLines = [unarchiver decodeObjectForKey:kRootKey];
26         [unarchiver finishDecoding];
27         for (int i = 0; i < 4; i++) {
28             UITextField * theField = self.lineFields[i];
29             theField.text = fourLines.lines[i];
30         }
31     }
32     UIApplication * app = [UIApplication sharedApplication];
33     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
34 }
35 - (NSString *)dataFilePath
36 {
37     NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
38     NSString * documentsDirectory = [paths objectAtIndex:0];
39 //    return [documentsDirectory stringByAppendingPathComponent:@"data.plist"];
40     return [documentsDirectory stringByAppendingPathComponent:@"data.archive"];
41 }
42 - (void)applicationWillResignActive:(NSNotification *)notification
43 {
44     NSString * filePath = [self dataFilePath];
45 //    NSArray * array = [self.lineFields valueForKey:@"text"];
46 //    [array writeToFile:filePath atomically:YES];
47
48     FourLines * fourLines = [[FourLines alloc] init];
49     fourLines.lines = [self.lineFields valueForKey:@"text"];
50     NSMutableData * data = [[NSMutableData alloc] init];
51     NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
52     [archiver encodeObject:fourLines forKey:kRootKey];
53     [archiver finishEncoding];
54     [data writeToFile:filePath atomically:YES];
55 }
56 - (void)didReceiveMemoryWarning {
57     [super didReceiveMemoryWarning];
58     // Dispose of any resources that can be recreated.
59 }
60
61 @end

时间: 2024-10-09 00:48:13

数据持久化基础知识——归档的相关文章

数据持久化基础知识——属性列表

1.属性列表 获取Document目录并在其后附加数据文件的文件名,这样就是数据文件的完整路径. 检查数据文件是否存在,如果不存在不加载它:如果存在就用该文件的内容实例化数组. 从属性列表中加载数据后,我们获得了对应用实例的引用,并使用该引用订阅UIApplicationWillResignActiveNotification. 应用程序终止运行或者进入后台之前保存数据.

iOS数据持久化之二——归档与设计可存储化的数据模型基类

iOS数据持久化之二--归档与设计可存储化的数据模型基类 一.引言 在上一篇博客中,我们介绍了用plist文件进行数据持久化的方法.虽然简单易用,但随着开发的深入,你会发现,这种方式还是有很大的局限性.试想,如果我们可以将用户的登录返回信息模型,游戏中角色的属性信息模型进行直接的持久化存取,那是不是非常爽的事,幸运的是,我们可以通过归档,来设计一个这样的数据模型. 二.先来精通归档吧 归档也是iOS提供给开发者的一种数据存储的方式,事实上,几乎所有的数据类型都可以通过归档来进行存取.其存储与读取

【IOS开发之Objective-C】数据持久化--文件和归档

在OC中数据持久化的方式有多种,例如:写入一个文件再或是归档.写入文件的方式我们一般都可以直接读取文件中的数据.比如我把数据写进一个XX.txt文档里面.只有数据写入成功了我就可以直接读取这个文件了.但是这样对于一些用户关键的数据并不能起到保密的作用,如果需要保密还需要使用归档操作. 文件的操作 //首先声明一个字符串 NSString * str1 = @"123456789"; 方式一 直接使用方法: - (BOOL)writeToFile:(NSString *)path ato

iOS数据持久化存储之归档NSKeyedArchiver

归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简单的归档 使用NSKeyedArichiver进行归档.NSKeyedUnarchiver进行接档,这种方式会在写入.读出数据之前对数据进行序列化.反序列化操作. 归档:  //1.获取文件路径 NSString *docPath=[NSSearchPathForDirectoriesInDomai

iOS 开发指南 第11章 数据持久化之对象归档 学习

1 是一种序列化方式,先将归档对象序列化为一个文件,然后再通过反归档将数据恢复到对象中. 条件:该对象的类必须实现NSCoding协议,而且每个成员变量应该是基本数据类型或都是实现NSCoding协议的某个类的实例. 归档类NSKeyedArchiver 反归档类NSKeyedUnarchiver  NSData类提供了读取数据文件的方法 方法:+dataWithContentsOfFile: +dataWithContentsOfFile:options:指定读取数据选项error: -ini

深入JVM读书笔记(一)——jvm数据区基础知识

最近得空,就把<深入理解Java虚拟机>重新看了一遍,特写下现在的读书笔记,总结知识点,记录现在的理解,便于以后的回顾.下面的内容也会按照这本书的章节来划分知识点! Let's go! 想要了解Java虚拟机,一定要先明白Java运行时划分为哪些数据区域,具体的可以参考下图,按照是否为线程私有可以划分为: 线程私有:虚拟机栈.本地方法栈.程序计数器 线程共有:方法区.堆   下面详细说一下各个数据区的作用: 1. 程序计数器(Program Counter Register) 程序计数器是一块

ArcGIS教程:3D 数据的基础知识

三维 GIS 数据的定义 (x,y,z) 中包含一个额外维度(z 值).Z 值具有测量单位,同传统 2D GIS 数据 (x,y)相比,其可存储和显示更多的信息.虽然 z 值通常为实际高程值(如海拔高度或地理深度),但未规定必须强制执行此方法.Z 值可用于表示许多内容,例如化学物质浓度.位置的适宜性,甚至完全用于表示等级的值. 3D GIS 数据有两种基本类型:要素数据和表面数据. 3D 要素数据 要素数据表示离散对象,每个对象的 3D 信息都存储在要素的几何中. 三维要素数据可对每个 x,y

PHP数据访问基础知识(20161028)

数据访问 动态页面的特征:能够读取数据库,网页的内容都是从数据库读出来的,而不是写死的 所有的程序归根结底都是对数据的增删改查 如何用服务器的PHP来操作服务器的MySQL,Apache则是用来管理,接收用户的请求,返回用户的请求.信息 要想实现数据访问,首先要在PHP和MySQL之间建立一个数据的通道,即:建一个连接,造一个连接对象 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http

数据表基础知识

数据类型: 基本数据类型:按数据的表现方式及存储方式的不同可以分为以下几个类型 整数数据类型 货币数据类型 浮点数据类型 日期/时间数据类型 字符数据类型 二进制数据类型 图形和文本数据类型 用户自定义数据类型.用自定义数据类型并不是真正的数据类型,通过使用自定义数据类型能够简化对常用规则和默认值的管理. 数据表的数据完整性: 数据完整性是指列中的每个事件都有正确的数据值.数据值的数据类型必须正确,并且数据值必须位于正确域中. 引用完整性是指表之间的关系得到正确的维护.一表中的数据只应指向另一表