数据存储值归档Archive

先比較一下各个数据存储之间的关系:

关于归档。是ios中的shu‘j数据存储中的一种数据存储方式。以下了解一下归档中的一个实例:

以下的是父类person
#import <Foundation/Foundation.h>

@interface Person : NSObject <NSCoding>
@property (nonatomic,copy) NSString *name;
@property (nonatomic,assign) int age;
@property (nonatomic,assign ) BOOL sex;
@property (nonatomic,assign) float height;
@property (nonatomic,assign) double weight;
@end

#import "Person.h"

@implementation Person

//有存必然是有取。所以存是为了取
- (id)initWithCoder:(NSCoder *)aDecoder{
    
    self = [super init];
    
    if (self) {
        NSLog(@"存在");
        self.name =   [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeInt32ForKey:@"age"];
        self.sex = [aDecoder decodeBoolForKey:@"sex"];
        self.height = [aDecoder decodeFloatForKey:@"height"];
        self.weight = [aDecoder decodeDoubleForKey:@"weight"];
    }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder{

    //有文件就能够看出编码的是一个方式编码
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInt:self.age forKey:@"age"];
    [aCoder encodeBool:self.sex forKey:@"sex"];
    [aCoder encodeFloat:self.height forKey:@"height"];
    [aCoder encodeDouble:self.weight forKey:@"weight"];

}
@end
子类student继承person类:

#import <Foundation/Foundation.h>
#include "Person.h"

@interface Student : Person

@property (nonatomic,copy )NSString * content;
@property (nonatomic,assign ) float grade;

@end
#import "Student.h"

@implementation Student

//有存必然是有取,所以存是为了取
- (id)initWithCoder:(NSCoder *)aDecoder{

    if (self = [super initWithCoder:aDecoder]) {
        NSLog(@"存在");
        self.content =   [aDecoder decodeObjectForKey:@"content"];
        self.grade = [aDecoder decodeFloatForKey:@"grade"];
            }
    return self;
}

-(void)encodeWithCoder:(NSCoder *)aCoder{

    [super encodeWithCoder:aCoder];
    //有文件就能够看出编码的是一个方式编码
    [aCoder encodeObject:self.content forKey:@"content"];
    [aCoder encodeFloat:self.grade forKey:@"grade"];

}

@end

以下是在ViewController中中对数据通过两button对数据进归档和解归档

#import "ViewController.h"
#import "Person.h"
#import "Student.h"

@interface ViewController ()
//分别室保存和获取的两个button
- (IBAction)saveArchive:(id)sender;
- (IBAction)obtainUnarchive:(id)sender;
@end

@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
}

//保存数据
- (IBAction)saveArchive:(id)sender {

    NSLog(@"開始编码归档而且保存");
    //归档需要要素:1、保存对象 2、保存的文件文件夹 3、保存管理器(归档器)

    //获取要保存的对象,对象必需要幼稚等等
//    Person *person = [[Person alloc]init];
//    person.age = 18;
//    person.name = @"linyu";
//    person.sex = YES; //表示为男的
//    person.height = 180;
//    person.weight = 60;

    Student *stu = [[Student alloc]init];
    stu.age = 18;
    stu.name = @"linyu";
    stu.sex = YES;
    stu.height = 180;
    stu.weight = 60;
    stu.content = @"I am a student !";
    stu.grade = 98.9;

    //获取要保存文件的路径
    NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString * dir = [documentDir stringByAppendingString:@"doc.txt"];
    NSLog(@"%@",dir);
    [NSKeyedArchiver archiveRootObject:stu toFile:dir];
}

//获取数据
- (IBAction)obtainUnarchive:(id)sender {
    //获取归档之后的内容、
    NSLog(@"获取内容");
    NSString *documentDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString * dir = [documentDir stringByAppendingString:@"doc.txt"];
    Student *per = [NSKeyedUnarchiver unarchiveObjectWithFile:dir];
    NSLog(@"%@",dir);
    NSLog(@"%@ %d %d %.2f %.2f %.2f %@",per.name,per.age,per.sex,per.height,per.weight,per.grade,per.content);
}
@end

输出的结果:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >

总结:

我们能够知道文件归档:

1、编号设置(preferrence)NSUserDefault:这个事实上也是通过plist文件来存储的。仅仅只是时里面已经通过封装了以后台上面了。存储在preferrence文件里。

2、plist文件。通过自己获取文件的路径(而且创建)。将数据存储到里面。这里一般都是在dorectory这个文件夹以下。

3、归档:归档的数据存储是经过一定的压缩。所以显示的不是明文的存储方式,而且归档是用来存储对象的。

4、注意要存储的类中遵循NSCoding 协议。

四种存储数据的方式中上面的两种方式是仅仅能够存储对应的主要的数据类型。——> 产生归档的方式进行存储。

(能够存储对象)

假设对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,能够直接用NSKeyedArchiver进行归档和恢复

不是全部的对象都能够直接用这样的方法进行归档,仅仅有遵守了NSCoding协议的对象才干够

NSCoding协议有2个方法:

encodeWithCoder:

每次归档对象时,都会调用这种方法。一般在这种方法里面指定怎样归档对象中的每一个实例变量,能够使用encodeObject:forKey:方法归档实例变量

initWithCoder:

每次从文件里恢复(解码)对象时,都会调用这种方法。一般在这种方法里面指定怎样解码文件里的数据为对象的实例变量,能够使用decodeObject:forKey方法解码实例变量

时间: 2024-10-06 09:13:52

数据存储值归档Archive的相关文章

数据存储之归档解档

归档也叫序列化,是将文件存在硬盘,解码是从硬盘还原一.使用属性列表进行归档 如果对象是NSString,NSDictionary,NSArray,NSData,NSNumber,NSDate,可以是使用writeToFile:atomically方法将数据写到文件,注意这种方式是明文. NSArray *inputArray = [NSArray arrayWithObjects:@"abc", @"123", @"qiaohaibin"]; /

OS开发UI篇—ios应用数据存储方式(归档)

OS开发UI篇—ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 02

iOS开发UI篇—ios应用数据存储方式(归档)

iOS开发UI篇-ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 1 // 2 // YYViewController.m 3 // 0

ios应用数据存储方式(归档)

ios应用数据存储方式(归档)  一.简单说明 在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 二.代码示例 1.文件结构 2.代码示例 YYViewController.m文件 9 #import "YYViewController.h" 10 #impo

数据存储之归档

在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦: 偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息) 归档:因为前两者都有一个致命的缺陷,只能存储常用的类型.归档可以实现把自定义的对象存放在文件中. 一.简单归档

IOS数据存储之归档(NSKeyedArchiver)/解档(NSKeyedUnarchiver)

前言: 前天学习了NSUserDefaults,我们知道NSUserDefaults不能保存自定义对象,所以我们今天来认识一下归档和解档.我们先来回顾一下JAVA是怎么实现保存一个自定义对象的!首先一个自定义对象必须实现Serializable接口,然后把一个对象序列化成二进制数据写入一个byte[]数据或者文件,反之则是从一个二进制数据或者文件中读取二进制数据反序列化成对象,所以我认为ios的归档解档其实就是类似JAVA序列化反序列化的过程,下面写个程序来尝试一下. 先测试下基础类型: //归

iOS 数据存储 - 02归档多个对象

1.NSData 1.介绍 使用archiveRootObject:toFile:方法可以将一个对象直接写入到一个文件中,但有时候可能想将多个对象写入到同一个文件中,那么就要使用NSData来进行归档对象 NSData可以为一些数据提供临时存储空间,以便随后写入文件,或者存放从磁盘读取的文件内容.可以使用[NSMutableDatadata]创建可变数据空间 2.范例 1. 归档(编码) // 新建一块可变数据区 NSMutableData *data = [NSMutableData data

OC语言--数据存储(归档&amp;plist&amp;Json)

1. 数据存储介绍 通常程序在运行过程中,或者程序结束之后,需要保存一些信息,而且需要持久化存储信息:比如登陆信息.视频播放记录.收藏记录等等:我们可以采用以下几种方式对数据进行持久化保存. a.文件 b.plist c.归档 d.NSUserDefaults e.数据库 接下来只介绍Plist和归档这两种方式. 2. 属性列表文件  Plist(Property List) (1)什么是plist文件, plist文件的作用 a. plist文件: property list  属性列表文件,

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

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