数据持久化(一)--NSKeyedArchiver

数据持久化:  将内存中的数据按某种格式存进磁盘

数据的种类:

1,结构化的数据

2, 字节流数据

结构化的数据        字节流

内存中结构化的数据   ->   磁盘,  叫: 归档

字节流               结构化

磁盘上的数据        ->  结构化到内存中, 叫:  反归档

字节流              字节流

内存中字节流的数据   ->   磁盘,  叫: 写文件

字节流              字节流

磁盘上的数据        ->   内存,  叫: 读文件

oc: 在内存中用NSData类的对象来装字节流数据

NSData类的对象具有一个写入磁盘的方法:      writeToFile

oc如何将结构化的数据转换成字节流:

概念:  序列化:  在内存中将结构化的数据转成字节流数据

反序列化: 在内存中将字节流的数据还原成结构化的数据

所以:  归档 = 序列化 +写文件

反归档 = 读文件 +反序列化

//********************************************

//c语言实现文件读写

void writeDataToFileByC(void)

{

// 第一步:  打开一个文件,只写打开

FILE* fp = fopen(PATH, "w");

if (fp==NULL) {

NSLog(@"文件打开失败");

return;

}

//从终端输入,放到buf的内存区

//清内存的动作是比较耗资源

//    char buf[128]={‘\0‘};  //[there isxxdsf afkjfakfas__________]

char buf[128];

gets(buf);

//第二步: 写文件

fwrite(buf, strlen(buf), 1, fp);

//关闭文件

fclose(fp);

}

void readDataFromFileByC(void)

{

//第一步: 打开一个文件,只读打开

FILE * fp = fopen(PATH, "r");

if (fp==NULL) {

NSLog(@"文件打开失败");

}

char buf[128]={‘\0‘};

//第二步: 读20个字节到buf的内存中

fread(buf, 20, 1, fp);

printf("读出的内容为:%s\n",buf);

//第三步: 关闭文件

fclose(fp);

}

//读出文件中的所有数据

void readAllDataFromFileByC(void)

{

FILE *fp=fopen(PATH, "r");

if (fp==NULL) {

NSLog(@"读文件失败");

}

char buf[128];

unsigned long int ret;

while (1) {

//将buf的内存清零

memset(buf, 0, sizeof(buf));

//从文件中读取数据放入buf的内存

ret=fread(buf, 20, 1, fp);

printf("ret=%lu",ret);

//如果返回的值不是1,就说明读到文件尾部或者发生了读错误

if (1!=ret)   {

printf("%s",buf);

printf("文件内容全部读完\n");

break;

}

//将buf中的数据打印

printf("%s",buf);

}

fclose(fp);

}

void appendDataToFile(void)

{

FILE * fp = fopen(PATH, "a");

char buf[128];

while (1) {

gets(buf);

if (*buf==‘q‘) {

break;

}

fwrite(buf, strlen(buf), 1, fp);

}

fclose(fp);

}

//********************************************

/*

归档与反归档总结:

1, 用NSKeyedArchiver归档生成的文件应该用NSKeyedUnarchiver来反归档

2, 用结构化数据的协议方法writeToFile:归档的文件应该用结构化

数据的 xxxWithContentsOfFile:方法来反归档

3, 将多种结构化的数据归档到一个文件时,只能用NSKeyedArchiver

反归档只能用NSKeyedUnarchiver

4, 用NSKeyedArchiver归档时,data必须是可变的

5, NSKeyedArchiver和NSKeyedUnarchiver这对工具只完成序列化

和反序列化, 写文件和读文件全部由NSData来完成

6, 如果其它类或自定义的类对象需要拥有归档和反归档功能,必须遵守协议()

*/

#define PATH @"/Users/wenhua/Desktop/Tomcat.plist"

#define ARRAYPATH @"/Users/wenhua/Desktop/array.xml"

#define DICTPATH @"/Users/wenhua/Desktop/dict.xml"

void archiverForNSString(void)

{

NSString* str =@"abcdefg";

// 序列化过程

NSData* data = [str dataUsingEncoding:NSUTF8StringEncoding];

//写文件过程

[data writeToFile:PATH atomically:YES];

}

void unarchiveForNSString(void)

{

//读文件

NSData * data = [NSData dataWithContentsOfFile:PATH];

//反序列化

NSString * str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

NSLog(@"str: %@",str);

}

void archiverForNSArray(void)

{

NSArray * array = @[@"one",@"two",@"three",@"four"];

NSMutableData* data = [[NSMutableData alloc]init];

// NSKeyedArchiver; 归档器可以将多种结构化数据完成序列化,其中每种数据都对应一个key

//创建一个归档器,但归档器需要使用一个可变的字节流工具

NSKeyedArchiver *archiver = [[ NSKeyedArchiver alloc]initForWritingWithMutableData:data];

//序列化过程

[archiver encodeObject:array forKey:@"arrayKey"];

//让归档器结束序列化工作,

[archiver finishEncoding];

//将字节流数据写入文件

[data writeToFile:PATH atomically:YES];

}

void unarchiverForNSArray(void)

{

//第一步: 读   由NSData完成

//第二步: 反序列化  由反归档器完成

// 读文件到字节流容器中

NSData * data = [ NSData dataWithContentsOfFile:PATH];

//反归档器完成的功能是:反序列化,将字节流容器中的字节流转成结构化数据

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

//反序列化的过程,该方法返回一个结构化数据的对象

id obj = [unarchiver decodeObjectForKey:@"arrayKey"];

//判断一下反序列化后的对象是不是数组

if ([obj isKindOfClass:NSClassFromString(@"NSArray")]) {

NSLog(@"obj是一个NSArray类的对象");

}

NSLog(@"obj:%@",obj);

}

void archiverForNSDictionary(void)

{

NSDictionary *dict = @{@"1":@"one",@"2":@"two",@"3":@"three"};

//第一步:  序列化

NSMutableData *data =  [[ NSMutableData alloc]init];

NSKeyedArchiver * archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

[archiver encodeObject:dict forKey:@"dictKey"];

[archiver finishEncoding];

//第二步: 写文件

[data writeToFile:PATH atomically:YES];

}

void unarchiverForNSDictionary(void)

{

NSData * data = [ NSData dataWithContentsOfFile:PATH];

NSKeyedUnarchiver * unarchiver = [[ NSKeyedUnarchiver alloc]initForReadingWithData:data];

NSDictionary *dict = [ unarchiver decodeObjectForKey:@"dictKey"];

NSLog(@"dict:%@",dict);

}

//将数组和字典同时归档到一个文件中

void archiverForArrayAndDictionary(void)

{

NSArray* array=@[@"element1",@"element2",@"element3"];

NSDictionary* dict = @{@"key1":@"value1",@"key2":@"value2",@"key3":@"value3"};

NSMutableData* data = [[ NSMutableData alloc]init];

NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];

[archiver encodeObject:array forKey:@"array"];

[archiver encodeObject:dict forKey:@"dictionary"];

[archiver finishEncoding];

[data writeToFile:PATH atomically:YES];

}

//从一个文件中反归档出数组和字典

void unarchiverForArrayAndDictionary(void)

{

NSData *data = [NSData dataWithContentsOfFile:PATH];

NSKeyedUnarchiver * unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

NSArray* array=[unarchiver decodeObjectForKey:@"array"];

NSDictionary* dict = [ unarchiver decodeObjectForKey:@"dictionary"];

NSLog(@"array:%@",array);

NSLog(@"dict:%@",dict);

}

//数组的最简单的数据持久化

void writeToFileForNSArray(void)

{

NSArray * array  = @[@"abc",@"123",@"xyz"];

NSLog(@"array:%p,%@",array,array);

[array writeToFile: ARRAYPATH atomically:YES];

NSArray * newArray = [ NSArray arrayWithContentsOfFile:ARRAYPATH];

NSLog(@"newArray:%p,%@",newArray,newArray);

}

void writeToFileForNSDictionary(void)

{

NSDictionary *dict = @{@"1":@"one",@"2":@"two",@"3":@"three"};

NSLog(@"dict:%p, %@",dict,dict);

[dict writeToFile:DICTPATH atomically:YES];

NSDictionary *newDict = [ NSDictionary dictionaryWithContentsOfFile:DICTPATH];

NSLog(@"newDict:%p,%@",newDict,newDict);

}

//********************************************

//********************************************

时间: 2024-10-18 19:02:46

数据持久化(一)--NSKeyedArchiver的相关文章

IOS数据持久化之归档NSKeyedArchiver, NSUserDefaults,writeToFile

//2.文件读写 //支持:NSString, NSArray , NSDictionay, NSData //注:集合(NSArray, NSDictionay)中得元素也必须是这四种类型, 才能够进行文件读写 //string文件读写 NSString *string = @"假如给我有索纳塔"; //Document NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUs

IOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List .NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等) 下面主要来介绍一个归档NSKeyedArchiver. 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象. 归档方式: 对Foundation框架中对象进行归档 对自定义的内容进行归档

iOS开发笔记-swift实现iOS数据持久化之归档NSKeyedArchiver

IOS数据持久化的方式分为三种: 属性列表 (plist.NSUserDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite.Core Data.第三方类库等 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上:程序运行过程中或者当再次重写打开程序的时候,可以通过解归档(反序列化)还原这些对象.本文主要介绍swift实现iOS数据归档. 归档Foundation框架对象 func archiveData(){ var path: AnyObject=NS

UI_19 数据持久化(本地存储)

一.数据持久化概述 数据持久化就是数据的永久存储.其本质是将数据保存为文件,存到程序的沙盒中. 1.数据持久化的方式 1.1 writeToFile:简单对象写入文件 1.2 NSUserDefaults:应用程序偏好设置1.3 Sqlite:轻量级关系型数据库,不能直接存储对象(NSData除外),需要用到一些SQL语句,先将复杂对象归档(对象->NSData) 1.4 CoreData:对象型数据库,实质是将数据库的内部存储细节封装 1.5 Plist文件 2.应用程序沙盒 每一应用程序都有

iOS中几种数据持久化方案

概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方案: plist文件(属性列表) preference(偏好设置) NSKeyedArchiver(归档) SQLite 3 CoreData 沙盒 在介绍各种存储方法之前,有必要说明以下沙盒机制.iOS程序默认情况下只能访问程序自己的目录,这个目录被称为"沙盒". 1.结构 既然沙盒就是一个文件夹,那就看看里面有什么吧

深入理解iPhone数据持久化(手把手教你iphone开发 – 基础篇)

在所有的移动开发平台数据持久化都是很重要的部分:在j2me中是rms或保存在应用程序的目录中,在symbian中可以保存在相应的磁盘目录中和数据库中.symbian中因为权限认证的原因,在3rd上大多数只能访问应用程序的private目录或其它系统共享目录.在iphone中,apple博采众长,提供了多种数据持久化的方法,下面笔者会逐个进行详细的讲解. iphone提供的数据持久化的方法,从数据保存的方式上讲可以分为三大部分:属性列表.对象归档.嵌入式数据库(SQLite3).其他方法. 一.属

iOS数据持久化存储

本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每个客户端软件都需要做的.简单如"是否第一次打开"的BOOL值,大到游戏的进度和状态等数据,都需要进行本地持久化存储.这些数据的存储本质上就是写磁盘存文件,原始一点可以用iOS本身支持有NSFileManager这样的API,或者干脆C语言fwrite/fread,Cocoa Touch本身

[Objective-C] 011_数据持久化_NSKeyedArchiver

在日常开发中对于NSString.NSDictionary.NSArray.NSData.NSNumber这些基本类的数据持久化,可以用属性列表的方法持久化到.plist 文件中.但是一些我们自定义的类的话,属性列表的方法就不能用了,这时候是NSKeyedArchiver出马的时候了.以我们前面写的Person 类为例,看NSKeyedArchiver 如何一展身手. Person 类 ////////////////// .h //////////////// #import <Foundat

IOS数据持久化的4种方式

9.1 数据持久化概述 9.2 iOS应用程序目录结构 9.3 读写属性列表 9.4 对象归档 9.5 访问SQLite 9.1 数据持久化概述 iOS中可以有四种持久化数据的方式: 属性列表.对象归档.SQLite3和Core Data 9.2 iOS应用程序目录结构 iOS应用程序运行在Mac os模拟器时候,有一下临时目录模拟器3.1.3为例子: /Users/tony/Library/Application Support/iPhone Simulator/3.1.3/Applicati