IOS开发-数据持久化(一)【文本文件+二进制归档】

概要

数据持久化分为不同的方式,本章主要简示了数据归档(一般而说的序列化)和写XML的文本文件方式。其中XML文本方式主要使用NSArray或者NSDictionary的writeToFile方法,而数据归档使用了NSKeyedArchiver/NSKeyedUnarchiver等实现数据的归档(序列化)。

结果展示

程序展示

数据化文件

注意新版本的IOS模拟器的目录和以前的目录不在同一个地方,其中plist文件是XML文件,可打开直接查看,而archi是归档的二进制文件。

流程概要

1.新建工程,拖拉界面,完成程序除归档外的操作,具体操作:略

2.对于XML存储,将需要存储的数据放到字典或者数组中,然后调用WriteToFile把数据保存到文件,使用类方法initWithContentsOfFile读取存储的数据即可

3.数据归档化相对而言较复杂点,需要新建一个数据类,该类需要实现了NSCoding协议,然后实现编码和解码两个方法。

4.在需要数据存储的地方把需要的数据放到步骤3中的数据类的对象中,然后结合使用NSMutableData和NSKeyedArchiver实现数据归档。

5.略

主要代码

数据类

h文件

//
//  Staff.h
//  DataXMLArchiver
//
//  Created by God Lin on 14/12/9.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Staff : NSObject <NSCoding>
{
    NSString* _nickName;
    NSString* _email;
    NSString* _phone;
    NSString* _sex;
    NSString* _position;
}

@property (nonatomic, retain) NSString* _nickName;
@property (nonatomic, retain) NSString* _email;
@property (nonatomic, retain) NSString* _phone;
@property (nonatomic, retain) NSString* _sex;
@property (nonatomic, retain) NSString* _position;
@end

m文件

//
//  Staff.m
//  DataXMLArchiver
//
//  Created by God Lin on 14/12/9.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "Staff.h"

@implementation Staff

@synthesize _nickName;
@synthesize _email;
@synthesize _phone;
@synthesize _sex;
@synthesize _position;

#pragma NSCoding 实现序列化(归档)
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self._nickName forKey:@"nickName"];
    [aCoder encodeObject:self._email forKey:@"email"];
    [aCoder encodeObject:self._phone forKey:@"phone"];
    [aCoder encodeObject:self._sex forKey:@"sex"];
    [aCoder encodeObject:self._position forKey:@"position"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
    self._nickName = [aDecoder decodeObjectForKey:@"nickName"];
    self._email = [aDecoder decodeObjectForKey:@"email"];
    self._phone = [aDecoder decodeObjectForKey:@"phone"];
    self._sex = [aDecoder decodeObjectForKey:@"sex"];
    self._position = [aDecoder decodeObjectForKey:@"position"];
    return self;
}
@end

程序主体代码

h文件

//
//  ViewController.h
//  DataXMLArchiver
//
//  Created by God Lin on 14/12/9.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    IBOutlet UITextField* _textNickName;
    IBOutlet UITextField* _textEmail;
    IBOutlet UITextField* _textPhone;
    IBOutlet UITextField* _textSex;
    IBOutlet UITextField* _textPosition;
}
@property (nonatomic, retain) UITextField* _textNickName;
@property (nonatomic, retain)UITextField* _textEmail;
@property (nonatomic, retain)UITextField* _textPhone;
@property (nonatomic, retain)UITextField* _textSex;
@property (nonatomic, retain)UITextField* _textPosition;

-(IBAction)onHideKeyboard:(id)sender;
-(IBAction)onXmlSave:(id)sender;
-(IBAction)onXmlLoad:(id)sender;
-(IBAction)onArchiverSave:(id)sender;
-(IBAction)onArchiverLoad:(id)sender;
@end

m文件

//
//  ViewController.m
//  DataXMLArchiver
//
//  Created by God Lin on 14/12/9.
//  Copyright (c) 2014年 arbboter. All rights reserved.
//

#import "ViewController.h"
#import "Staff.h"

@interface ViewController ()

@end

@implementation ViewController

@synthesize _textNickName;
@synthesize _textEmail;
@synthesize _textPhone;
@synthesize _textSex;
@synthesize _textPosition;

-(IBAction)onHideKeyboard:(id)sender
{
    [sender resignFirstResponder];
}
-(NSString*)getDocumentDir
{
    // 获取保存的文件名
    NSArray* arrayPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    return [arrayPath objectAtIndex:0];
}
-(void)textClear
{
    self._textNickName.text = @"";
    self._textEmail.text = @"";
    self._textPhone.text = @"";
    self._textSex.text = @"";
    self._textPosition.text = @"";
}

// XML文本保存数据,可使用数组字典等保存数据
-(IBAction)onXmlSave:(id)sender
{
    // 保存数据到字典
    NSMutableDictionary* dict = [[NSMutableDictionary alloc] init];
    [dict setObject:self._textNickName.text forKey:@"nickName"];
    [dict setObject:self._textEmail.text forKey:@"email"];
    [dict setObject:self._textPhone.text forKey:@"phone"];
    [dict setObject:self._textSex.text forKey:@"sex"];
    [dict setObject:self._textPosition.text forKey:@"position"];

    NSString* pathFile = [self getDocumentDir];
    pathFile = [pathFile stringByAppendingPathComponent:@"staff.plist"];

    // 数据写入文件
    [dict writeToFile:pathFile atomically:YES];

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Infomation" message:@"Save finished" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    // 使用ARC,自己不需要管理内存
    //[alert release];
    [self textClear];
}
-(IBAction)onXmlLoad:(id)sender
{
    // 获取保存的文件名
    NSString* pathFile = [self getDocumentDir];
    pathFile = [pathFile stringByAppendingPathComponent:@"staff.plist"];

    NSDictionary* dict = [[NSDictionary alloc] initWithContentsOfFile:pathFile];
    self._textNickName.text = [dict objectForKey:@"nickName"];
    self._textEmail.text = [dict objectForKey:@"email"];
    self._textPhone.text = [dict objectForKey:@"phone"];
    self._textSex.text = [dict objectForKey:@"sex"];
    self._textPosition.text = [dict objectForKey:@"position"];

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Infomation" message:@"Load finished" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}

// 归档化数据
-(IBAction)onArchiverSave:(id)sender
{
    Staff* staff = [[Staff alloc] init];
    staff._nickName = self._textNickName.text;
    staff._email = self._textEmail.text;
    staff._phone = self._textPhone.text;
    staff._sex = self._textSex.text;
    staff._position = self._textPosition.text;

    // 新建二进制内存(读写)
    NSMutableData* data = [[NSMutableData alloc] init];

    // 设置二进制内存数据内容(读写)
    NSKeyedArchiver* archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:staff forKey:@"staff"];
    [archiver finishEncoding];

    // 获取保存的文件名
    NSString* pathFile = [self getDocumentDir];
    pathFile = [pathFile stringByAppendingPathComponent:@"staff.archi"];

    // 保存数据(归档)
    [data writeToFile:pathFile atomically:YES];

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Infomation" message:@"Archive finished" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
    [self textClear];
}
-(IBAction)onArchiverLoad:(id)sender
{
    // 获取保存的文件名
    NSString* pathFile = [self getDocumentDir];
    pathFile = [pathFile stringByAppendingPathComponent:@"staff.archi"];

    // 读取归档文件到内存(只读)
    NSData* data = [NSData dataWithContentsOfFile:pathFile];

    // 解码内存数据(只读)
    NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
    Staff* staff = [unarchiver decodeObjectForKey:@"staff"];
    [unarchiver finishDecoding];

    self._textNickName.text = staff._nickName;
    self._textEmail.text = staff._email;
    self._textPhone.text = staff._phone;
    self._textSex.text = staff._sex;
    self._textPosition.text = staff._position;

    UIAlertView* alert = [[UIAlertView alloc] initWithTitle:@"Infomation" message:@"Load from Archiver finished" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    [alert show];
}
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

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

@end

工程代码

时间: 2024-10-11 07:43:10

IOS开发-数据持久化(一)【文本文件+二进制归档】的相关文章

iOS开发——数据持久化OC篇&amp;(三)对象归档

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

IOS开发--数据持久化篇之文件存储(一)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 什么叫数据持久化: 在这里我就不照搬教科书上抽象的概念了.我觉得既然要把东西写出来就让它简单明了. 要搞清楚数据持久化,首先要知道数据持久化是相对于缓存而言的,缓存是在程序运行的过程中保存在内存中,程序一旦运行结束,其内存就会被释放.缓存在内存中的数据也就随之消失. 那么数据持久化就是要解

iOS开发——数据持久化OC篇&amp;总结

数据持久化总结 1 //1.沙盒:/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3 2 /** 3 // 1.获取程序的Home目录 4 NSString *home = NSHomeDirectory(); 5 NSLog(@"应用程序目录:%@", home); 6 7 // 2.获取Documents目录 8

IOS开发-数据持久化(二)【sqlite数据库】

概要 本章主要简示了IOS开发中使用sqlite来持久化数据,其使用方法和C++中使用sqlite基本一致. 结果展示 (其实没啥看的) 流程概要 1.因为使用的是以前的工程,所以主需要再拖拉两个按钮就差不多了 2.因为要使用sqlite,所以需要引用sqlite库(sqlite框架),在工程设置里面的,如下图所示 3.在原先的序列化类里面添加保存和加载数据到数据库的函数,即可,具体见代码. 主要代码 数据库操作代码 -(id)initWithFilePath:(NSString*)file {

iOS开发——数据持久化OC篇&amp;(五)SQLite3详解

SQLite3详解 SQLite是嵌入式的和轻量级的SQL数据库.SQLite是由C实现的.广泛用于包括浏览器(支持HTML5的大部分浏览器,IE除外).iOS.Android以及一些便携需求的小型web应用系统. 1 使用原因:存储.检索信息 2 SQLite是MySQL精简版.但无需服务器就能进行. 3 两个限制:1)必须手动创建数据库 2)没有面向对象的接口. 4 如何手动创建数据库. 使用SQLite前的准备 使用SQLite是很多做iOS开发中第一次面对C的情况,包括我.因为SQLit

IOS开发--数据持久化篇文件存储(二)

前言:个人觉得开发人员最大的悲哀莫过于懂得使用却不明白其中的原理.在代码之前我觉得还是有必要简单阐述下相关的一些知识点. 因为文章或深或浅总有适合的人群.若有朋友发现了其中不正确的观点还望多多指出,不胜感激. 承接上篇博客我们来看看IOS开发中是如何将一个自定义的对象进行归档的 本篇博客将介绍以下几个方面的内容 1)普通的单个对象归档操作 2)拥有继承关系的对象归档 3)同时将多个对象进行归档 1.普通的单个对象归档操作 首先我们来看下最简单的单个对象归档操作 1.自定义一个跟小明一样有名的类(

iOS开发数据持久化技术01——NSUserDefault介绍

有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 首先说下什么是数据持久化技术 NSString *str = @"hello world"; ->内存 实际上就是将数据存储到硬盘上,针对于iOS应用程序是存储到沙盒中. . NSUserDefault介绍 1 是系统提供的自定义的类,可以随时在需要使用的地方声明对象,并随时需要的时候取出对象 2 支持的对象类型:NSString, NSNumber, NSData,

iOS开发——数据持久化OC篇&amp;(二)属性列表

属性列表 属性列表文件是一种XML文件,Foundation框架中的数组和字典等都可以于属性列表文件相互转换. NSArray类常用读写属性列表文件的方法: +arrayWithContentsOfFile:类级构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -initWithContentsOfFile:实例构造方法,用于从属性列表文件中读取数据,创建NSArray对象. -writeToFile:atomically:该方法把NSArray对象写入到属性列表文件中,第一个参

iOS开发数据持久化,归档方法

1.把要显示的数据转换为模型,把对象归档,然后把存起来的对象解析出来就可以使用 2.可以封装起来方便使用,封装的方法存入百度云,需要的可以留言 /** 归档方法 */-(void)archive{    /**      *     常用的几个文件目录   directory目录     * NSDownloadsDirectory 下载文件目录     * NSDocumentDirectory 数据文件目录     * NSCachesDirectory 缓存文件目录     * NSMov