数据存储之归档

在使用plist进行数据存储和读取,只适用于系统自带的一些常用类型才能用,且必须先获取路径相对麻烦;

偏好设置(将所有的东西都保存在同一个文件夹下面,且主要用于存储应用的设置信息)

归档:因为前两者都有一个致命的缺陷,只能存储常用的类型。归档可以实现把自定义的对象存放在文件中。

代码演示

先看下项目的结构  Student类继承Person类

在ViewController.m中

//
//  ViewController.m
//  Archive
//
//  Created by City--Online on 15/4/22.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSArray *documents=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentpath=[documents firstObject];
//    NSLog(@"%@",documentpath);
    NSString *filePath=[documentpath stringByAppendingPathComponent:@"CYW"];

//使用archiveRootObject简单归档 单个对象
    //缺点:只能把一个对象归档到一个文件
#if 0
    NSArray *arr=[[NSArray alloc]initWithObjects:@"1",@"2",@"3", nil];
    //归档 //可对字典、数组、字符串、数字等进行归档 返回bool值表示是否归档成功
    [NSKeyedArchiver archiveRootObject:arr toFile:filePath];
#endif
#if 0
    //解挡
    NSArray *arr=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
    NSLog(@"%@",arr);
#endif

     //多个对象归档
#if 0
    //准备数据
    CGPoint point=CGPointMake(100, 100);
    NSString *mystring=@"cuiyanwei";
    BOOL YesOrNo=YES;
    //归档
    NSMutableData *mutableData=[[NSMutableData alloc]init];
    NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];

    [archiver encodeCGPoint:point forKey:@"mypoint"];
    [archiver encodeBool:YesOrNo forKey:@"mybool"];
    [archiver encodeObject:mystring forKey:@"mystring"];
    [archiver finishEncoding];
    [mutableData writeToFile:filePath atomically:YES];
#endif
#if 0
    //多对象解档
    NSMutableData *mutableData=[[NSMutableData alloc]initWithContentsOfFile:filePath];
    NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:mutableData];
    CGPoint point=[unarchiver decodeCGPointForKey:@"mypoint"];
    BOOL mybool=[unarchiver decodeBoolForKey:@"mybool"];
    NSString *mystring=[unarchiver decodeObjectForKey:@"mystring"];
    [unarchiver finishDecoding];
    NSLog(@"X=%lf,Y=%lf\n mybool=%d\n mystring=%@",point.x,point.y,mybool,mystring);
    UIImage
#endif

#if 0
    //自定义对象归档
    Student *stu1=[[Student alloc]init];
    stu1.name=@"cuiyanwei";
    stu1.age=24;
    stu1.photo=[UIImage imageNamed:@"email.png"];
    stu1.stuId=@"001";

    Student *stu2=[[Student alloc]init];
    stu2.name=@"xiaocui";
    stu2.age=23;
    stu2.photo=[UIImage imageNamed:@"email.png"];
    stu2.stuId=@"002";

    //归档
    NSArray *array=[[NSArray alloc]initWithObjects:stu1,stu2, nil];
    NSMutableData *mutableData=[[NSMutableData alloc]init];
    NSKeyedArchiver *archiver=[[NSKeyedArchiver alloc]initForWritingWithMutableData:mutableData];
    [archiver encodeObject:array forKey:@"students"];
    [archiver finishEncoding];
    [mutableData writeToFile:filePath atomically:YES];
#endif
#if 1
    //解档
    NSMutableData *mutableData=[[NSMutableData alloc]initWithContentsOfFile:filePath];
    NSKeyedUnarchiver *unarchiver=[[NSKeyedUnarchiver alloc]initForReadingWithData:mutableData];
    NSArray *array=[unarchiver decodeObjectForKey:@"students"];
    for (Student *stu in array) {
        NSLog(@"name=%@ age=%ld photo=%@ stuId=%@",stu.name,stu.age,stu.photo,stu.stuId);
    }
#endif

}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

在Person.h中定义了几个属性

//
//  Person.h
//  Archive
//
//  Created by City--Online on 15/4/22.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

#import <Foundation/Foundation.h>
//头像要添加框架在类中
#import <UIKit/UIKit.h>

//自定义保存到文件需要实现NSCoding协议
@interface Person : NSObject<NSCoding>

@property(nonatomic,strong)NSString *name;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,strong)UIImage *photo;

@end

在Person.m中实现NSCoding协议

//
//  Person.m
//  Archive
//
//  Created by City--Online on 15/4/22.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)encodeWithCoder:(NSCoder *)aCoder
{
     NSLog(@"person encodeWithCoder");
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeInteger:self.age forKey:@"age"];
    [aCoder encodeObject:self.photo forKey:@"photo"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self=[super init]) {
         NSLog(@"person encodeWithCoder");
        _age=[aDecoder decodeIntegerForKey:@"age"];
        _name=[aDecoder decodeObjectForKey:@"name"];
        _photo=[aDecoder decodeObjectForKey:@"photo"];
    }
    return self;
}
@end

 在Student类中继承Person类 增加了一个学号属性

#import "Person.h"

@interface Student : Person
@property(nonatomic,strong)NSString *stuId;
@end

 在Student.m中实现了NSCodeing协议

//
//  Student.m
//  Archive
//
//  Created by City--Online on 15/4/22.
//  Copyright (c) 2015年 CYW. All rights reserved.
//

#import "Student.h"

@implementation Student
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [super encodeWithCoder:aCoder];
    NSLog(@"student encodeWithCoder");
    [aCoder encodeObject:self.stuId forKey:@"stuId"];

}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self=[super initWithCoder:aDecoder]) {
        NSLog(@"student initWithCoder");
        _stuId=[aDecoder decodeObjectForKey:@"stuId"];
    }
    return self;
}
@end

 自定义模型对象归档解档运行结果如下:

主要是实现NSCoding协议

时间: 2024-08-03 11:29:23

数据存储之归档的相关文章

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

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

数据存储指南之存储备份技术

备份|数据 数据存储备份技术一般包含硬件技术及软件技术等,硬件技术主要是磁带机技术,软件技术主要是通用和专用备份软件技术等. 磁带机技术: 无论是硬盘技术,还是光盘技术,都不适合用来进行数据存储备份,只有磁带机技术才真正适合数据存储备份领域.事实上,磁带机技术长期以来一直是首选的唯一的数据存储备份技术,因为磁带介质不仅能提供高容量.高可靠性以及可管理性,而且价格比光盘.磁盘媒体便宜很多. 作为一种备份设备,磁带机技术也在不断发展.当前市场上的磁带机,按其记录方式来分,可归纳为二大类:一类是数据流

对比iOS中的四种数据存储

你是用什么方法来持久保存数据的?这是在几乎每一次关于iOS技术的交流或讨论都会被提到的问题,而且 大家对这个问题的热情持续高涨.本文主要从概念上把"数据存储"这个问题进行剖析,并且结合各自特点和 适用场景给大家提供一个选择的思路,并不详细介绍某一种方式的技术细节. 谈到数据储存,首先要 明确区分两个概念,数据结构和储存方式.所谓数据结构就是数据存在的形式.除了基本的NSDictionary. NSArray和NSSet这些对象,还有更复杂的如:关系模型.对象图和属性列表多种结构.而存储

数据存储之属性列表Plist

常用的数据存储有属性列表.偏好设置.归档.sqlite.coreData.上一博客了解了沙盒,现在了解下属性列表Plist. 通常通过NSArray.NSDictionary集合类的WriteToFile:atomically方法将他们存储到属性列表中.在属性列表能保存的数据类型如下 所以可以序列化的类有以下这些: NSArray.NSMutableArray.NSDictionary.NSMutableDictionary.NSData.NSMutableData.NSDate.NSStrin

华为与英特尔构建全融合大数据存储解决方案

IDC预测,全球数据总量将在2020年达到40ZB.40ZB的数据量是什么概念呢? IDC给出了一个比喻:如果把一粒沙子当做一个字的话,40ZB的数据量相当于地球上所有海滩上沙子数量的57倍;40ZB的数据量相当于667千亿部高清影片,一个人每天24小时连续不断地看,看完这些电影需要5万6千亿年;目前我们对地球年龄的估值是45.5亿年,意味着,如果这个人从地球诞生的时候就开始看电影,现在他只看完了这些电影总数的万分之八(0.0008).而这些数据,每两年还将翻一番,呈指数级增长态势.大数据将以一

详解大数据存储:哪些问题最容易出现

"大数据" 通常指的是那些数量巨大.难于收集.处理.分析的数据集,亦指那些在传统基础设施中长期保存的数据.这里的"大"有几层含义,它可以形容组织的大小,而更重要的是,它界定了企业中IT基础设施的规模.业内对大数据应用寄予了无限的期望 商业信息积累的越多价值也越大 只不过我们需要一个方法把这些价值挖掘出来. 也许人们对大数据的印象主要从存储容量的廉价性而来,但实际上,企业每天都在创造大量的数据,而且越来越多,而人们正在努力的从浩如烟海的数据中寻觅有价值的商业情报.另一

咕咚运动数据存储实践

咕咚APP--综合运动社交平台     咕咚APP致力于打造运动社交综合型平台,目前咕咚APP所涵盖人群包括:跑步.健走.骑行.游泳.滑雪.篮球.足球等多个领域,并为其提供相应功能进行承载.   咕咚APP有稳定的GPS轨迹记录及全面的数据存储,满足运动人群对于个体/群组的社交需求.咕咚APP已经拥有近5000万注册用户,日活人数450万+人,致力于为平台上千万运动爱好者,打造专属的运动功能.社交功能.以及独特的O2O功能.     互联网OLTP模型     缓存(ECS(redis&&

《大数据存储:MongoDB实战指南》一1.10 小结

1.10 小结 大数据存储:MongoDB实战指南 MongoDB是一个面向文档的数据库,不支持关系数据库中的join操作和事务.它用集合的概念代替了关系数据库中的表,用最小逻辑单元文档代替关系数据库中的行.它的集合结构是动态的,没有必要像关系数据库一样插入数据前先定义表结构,而且可以随时增加.修改.删除组成文档的字段. MongoDB支持当前所有主流编程语言的客户端驱动,使用方便,应用广泛,非常适合文档管理系统的应用.移动APP应用.游戏开发.电子商务应用.分析决策系统.归档和日志系统等应用.

云数据存储怎么“整”最划算?

云数据存储的高成本粉碎了企业公有云业务案例的梦想.一些企业表示他们可以以和按月云存储和用例费用相同的成本购买到硬盘.同时微软和谷歌免费赠送其SkyDrive和Google Drive服务.云消费者可能发现很难搞清楚价格差异到底体现在哪.为了能够完整的理解这些内容,就要看看在你购买云存储时,你实际得到了什么. 磁盘容量单独而言相对的不是那么贵,尤其是大规模应用上.你可以花费比100美金对一点的资金购买太字节的外接硬盘,比如,你可以假想要一个100TB容量的大型服务器,就可以为10,000个终端用户