• iOS——归档对象的创建,数据写入与读取


    归档(archiving)是指另一种形式的序列化,但它是任何对象都可以实现的更常规的模型。专门编写用于保存数据的任何模型对象都应该支持归档。比属性列表多了很良好的伸缩性,因为无论添加多少对象,将这些对象写入磁盘的方式都相同。但使用属性列表,工作量会随着添加对象而增加。

    创建一个工程,为ViewController。

    新建两个类为NJperson

    NJperson.h

    #import <Foundation/Foundation.h>

    // 如果想将一个自定义对象保存到文件中必须实现NSCoding协议
    @interface NJPerson : NSObject <NSCoding>

    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) int age;
    @property (nonatomic, assign) double height;
    @end

    NJperson.m

    #import "NJPerson.h"

    @implementation NJPerson


    // 当将一个自定义对象保存到文件的时候就会调用该方法
    // 在该方法中说明如何存储自定义对象的属性
    // 也就说在该方法中说清楚存储自定义对象的哪些属性
    - (void)encodeWithCoder:(NSCoder *)encoder
    {
        NSLog(@"NJPerson encodeWithCoder");
        [encoder encodeObject:self.name forKey:@"name"];
        [encoder encodeInteger:self.age forKey:@"age"];
        [encoder encodeFloat:self.height forKey:@"heigth"];
    }

    // 当从文件中读取一个对象的时候就会调用该方法
    // 在该方法中说明如何读取保存在文件中的对象
    // 也就是说在该方法中说清楚怎么读取文件中的对象
    - (id)initWithCoder:(NSCoder *)decoder
    {
        NSLog(@"NJPerson initWithCoder");
        if (self = [super init]) {
            self.name = [decoder decodeObjectForKey:@"name"];
            self.age = [decoder decodeIntegerForKey:@"age"];
            self.height = [decoder decodeFloatForKey:@"heigth"];
        }
        return self;
    }

    _______在项目中创建两个按钮:一个为save,一个为read。

    - (void)saveBtnClick:(id)sender{

     NJStudent *stu = [[NJStudent alloc] init];
        stu.name = @"lnj";
        stu.age = 28;
        stu.height = 1.8;

       // 2.获取文件路径
        NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];
        NSLog(@"path = %@", path);
        
        // 3.将自定义对象保存到文件中

        [NSKeyedArchiver archiveRootObject:stu toFile:path];

    }


    - (void)readBtnClick:(id)sender {

     // 1.获取文件路径
        NSString *docPath =  [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSString *path = [docPath stringByAppendingPathComponent:@"stu.xxoo"];

        // 2.从文件中读取对象
    //    NJPerson *p = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
        
        NJStudent *stu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

    }

     对数据对象进行归档和取消归档的另外一个例子如下:

    BIDFourLines.h

    #import <Foundation/Foundation.h>

    @interface BIDFourLines : NSObject<NSCoding,NSCopying>

    @property(copy,nonatomic)NSArray *lines;

    @end

    BIDFourLines.m

    #import "BIDFourLines.h"

    static NSString *const kLinesKey = @"kLinesKey";

    @implementation BIDFourLines

    -(id)initWithCoder:(NSCoder *)aDecoder{  //归档

        self = [super init];
        if (self) {
            
            self.lines = [aDecoder decodeObjectForKey:kLinesKey];
        }
        return self;
    }

    -(void)encodeWithCoder:(NSCoder *)aCoder{ //解档

        [aCoder encodeObject:self.lines forKey:kLinesKey];
    }

    #pragma mark copying
    -(id)copyWithZone:(NSZone *)zone{

        BIDFourLines *copy = [[[self class]allocWithZone:zone]init];
        NSMutableArray *linesCopy = [NSMutableArray array];
        
        for (id line in self.lines) {
            [linesCopy addObject:[line copyWithZone:zone]];
        }
        
        copy.lines = linesCopy;
        return copy;
    }
    @end

    #import "ViewController.h"
    #import "BIDFourLines.h"


    static NSString *const kRootKey = @"kRootKey";

    @interface ViewController ()

    @property(strong,nonatomic)IBOutletCollection(UITextField)NSArray *lineFields;

    @end

    @implementation ViewController



    -(NSString *)dataFilePath{
        
        //查找Document目录并在其后附加数据文件的文件名,这样就得到了数据文件的完整的路径

        NSArray *paths = NSSearchPathForDirectoriesInDomains(
                        NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentDirectory = [paths objectAtIndex:0];
        
        return [documentDirectory stringByAppendingPathComponent:@"data.archive"];
    }

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        //
        NSString *filePath = [self dataFilePath];
        
        //检查数据文件在不在
        
        if ([[NSFileManager defaultManager]fileExistsAtPath:filePath]) {
            
            NSData *data = [[NSMutableData alloc]initWithContentsOfFile:filePath];
            
            NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];
            
            BIDFourLines *fourLines = [unarchiver decodeObjectForKey:kRootKey];
            [unarchiver finishDecoding];
            
            
            for (int i = 0; i < 4; i++) {
                
                UITextField *theField = self.lineFields[i];
                
                theField.text = fourLines.lines[i];
            }
        }
        
        UIApplication *app = [UIApplication sharedApplication];
        [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:app];
        
    }
    //应用在终止运行或者进去后台之前保存数据

    -(void)applicationWillResignActive:(NSNotification *)notification{

        NSString *filePath = [self dataFilePath];
     
        BIDFourLines *fourLines = [[BIDFourLines alloc]init];
        fourLines.lines = [self.lineFields valueForKey:@"text"];
        
        NSMutableData *data = [[NSMutableData alloc]init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
        [archiver encodeObject:fourLines forKey:kRootKey];
        [archiver finishEncoding];
        
        [data writeToFile:filePath atomically:YES];

    }
    @end

  • 相关阅读:
    day5 元组,字典,集合
    day4预习
    day4字符串、列表
    day3预习
    day3 数据类型
    day2 python 基础入门
    动态三角形(动态规划思想入门)
    百度之星资格赛
    Audiophobia(Floyd算法)
    Hat’s Words(字典树的运用)
  • 原文地址:https://www.cnblogs.com/linxiu-0925/p/5395573.html
Copyright © 2020-2023  润新知