zoukankan      html  css  js  c++  java
  • 关于数据的归档存入文件和读取文件

    需求:我们都知道NSArry中如果存放的是普通的字符串类型,是很容易存入到plist文件中,也很容易从文件中读取出来,那如果NSArray中存放的是自定义的Person对象呢?该如何存入文件中去呢?

    下面我来简单写一个NSArray中继承了NSCoding协议的自定义Person对象,将这个array数组存入到plist文件中,并且能够实现读取文件中的数据的Demo

    实现步骤:

    1.创建一个SingleView的项目命名为test,然后创建一个自定义的Person对象,具有NSString *name和int age两个属性。

    Person.h:

    #import <Foundation/Foundation.h>
    @interface Person : NSObject<NSCopying,NSCoding>
    @property(copy,nonatomic)NSString *name;
    @property(assign,nonatomic) int age;
    @end

    Person.m:

    #import "Person.h"
    
    @implementation Person
    
    -(id)copyWithZone:(NSZone *)zone
    {
        Person  *p = [[Person alloc] init];  //拷贝函数不需要release,这里用autorelease会报错
        p.name = [self.name copy];
        p.age = self.age;
        return p;
    }
    
    //实现NSCoding协议
    -(void)encodeWithCoder:(NSCoder *)aCoder
    {
        [aCoder encodeObject:self.name forKey:@"name"];
        [aCoder encodeInt:self.age forKey:@"age"]; //这儿要根据不同的类型来写encode的类型
    }
    //反序列化提取成员变量
    -(id)initWithCoder:(NSCoder *)aDecoder
    {
        if (self = [super init]) {
            if (aDecoder == nil) {
                return self;
            }
            self.name = [aDecoder decodeObjectForKey:@"name"];
            self.age = [aDecoder decodeIntForKey:@"age"]; //这儿也是,如果是int类型就写decodeIntForKey
        }
        return self;
    }
    
    -(NSString *)description
    {
        return [NSString stringWithFormat:@"%@,%d",self.name,self.age];
    }
    
    @end

    2.创建一个ViewController来实现数据的的保存

    ViewController.h:

    #import <UIKit/UIKit.h>
    #import "Person.h"  
    @interface DXWViewController : UIViewController
    @property(nonatomic,retain)NSArray *Array;
    @property(nonatomic,retain)Person *per;
    @end

    ViewController.m:

    #import "DXWViewController.h"
    #define kSaveKeyMarkerLines (@"person")
    @interface DXWViewController ()
    
    @end
    
    @implementation DXWViewController
    
    -(NSString *)getPath
    {
        //用来获得Document地址
    	NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);//注意:这里是NSDocument不是NSDocumentation,特别注意
        NSLog(@"%@",arr);
        //在地址上增加文件
        NSString *path = [arr[0] stringByAppendingPathComponent:@"Person.plist"];
        NSLog(@"%@",path);
        return path;
    }
    
    //传入可变数组和地址
    //序列化数据
    - (BOOL)saveMarkers:(NSMutableArray *)markers toFilePath:(NSString *)filePath
    {
        BOOL f;
        NSMutableData *data = [[NSMutableData alloc] init];
        NSKeyedArchiver *vdArchiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        [vdArchiver encodeObject:markers forKey:kSaveKeyMarkerLines];
        [vdArchiver finishEncoding];
        f = [data writeToFile:filePath atomically:YES];
        [vdArchiver release];
        [data release];
        return f;
    }
    //传入地址,返回可变数组
    //反序列化数据
    - (NSMutableArray *)loadMarkersFromFilePath:(NSString *)filePath {
        NSMutableArray *markers = nil;
        if (filePath == nil || [filePath length] == 0 ||
            [[NSFileManager defaultManager] fileExistsAtPath:filePath] == NO) {
            markers = [[[NSMutableArray alloc] init] autorelease];
        } else {
            NSData *data = [[NSData alloc] initWithContentsOfFile:filePath];
            NSKeyedUnarchiver *vdUnarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
            markers = [vdUnarchiver decodeObjectForKey:kSaveKeyMarkerLines];
            NSLog(@"++++%@",markers);
            [vdUnarchiver finishDecoding];
            [vdUnarchiver release];
            [data release];
        }
        return markers;
    }
    
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	Person *p1 = [[Person alloc] init];
        p1.name = @"dingxiaowei";
        p1.age = 22;
        Person *p2 = [[Person alloc] init];
        p2.name = @"wangning";
        p2.age = 33;
        self.Array  = [NSArray arrayWithObjects:p1,p2, nil];
        //保存到文件
        [self saveMarkers:self.Array toFilePath:[self getPath]];
        //从文件中获取数据
        NSMutableArray *arr = [self loadMarkersFromFilePath:[self getPath]];
        NSLog(@"归档后提取的数据:
    %@",arr);
    }
    
    
    @end


    如何寻找创建在沙盒中的文件?

    点击一下mac机上的前往功能菜单->然后按下Alt键,会跳出一个资源库的一个隐藏文件->Application Support->iPhone Simulator->6.1(看你当前运行的模拟器的版本)->Applications->对应的文件->Documents->xxx.plist

    Demo源码:

    http://download.csdn.net/detail/s10141303/6013361

    运行结果:

    2013-08-26 14:04:47.101 test[1442:c07]归档后提取的数据:

    (

        "dingxiaowei,22",

        "wangning,33"

    )


  • 相关阅读:
    判别模型、生成模型与朴素贝叶斯方法
    git的安装已经连github
    uva 10061 How many zero's and how many digits ?
    Java菜鸟学习笔记()--面向对象篇(七):Wrapper Class包装类
    丁香园技术负责人冯大辉近日在知乎上披露了当年共同创办阿里巴巴的18个合伙人的近况:
    不用派生CTreeCtrl不用繁琐的过程 教你如何让CTreeCtrl的每一项有ToolTip提示
    数据结构排序系列详解之三 冒泡排序
    HDU 4612 (13年多校第二场1002)无向图缩点,有重边
    Mac下cocos2dx3.1用Cocos IDE写的Lua binding篇01
    SECURITY_ATTRIBUTES 设置低权限
  • 原文地址:https://www.cnblogs.com/keanuyaoo/p/3283258.html
Copyright © 2011-2022 走看看