zoukankan      html  css  js  c++  java
  • iphone开发中的数据存储:archiving model Objects

    让Model类遵循NSCoding 和 NSCopying 协议

    并实现三个方法:

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

    /*
    [super encodeWithCoder:encoder];
    //If you are subclassing a class that also conforms to NSCoding, you need to make sure you call encodeWithCoder: on your superclass,
    */
    [encoder encodeObject:foo forKey:kFooKey];
    [encoder encodeObject:bar forKey:kBarKey];
    [encoder encodeInt:someInt forKey:kSomeIntKey];
    [encoder encodeFloat:someFloat forKey:kSomeFloatKey]
    }
    - (id)initWithCoder:(NSCoder *)decoder 
    {
    if (self = [super init]) {
    //if(self = [super initWithCoder:decoder])
    foo = [decoder decodeObjectForKey:kFooKey];
    bar = [decoder decodeObjectForKey:kBarKey];
    someInt = [decoder decodeIntForKey:kSomeIntKey];
    someFloat = [decoder decodeFloatForKey:kAgeKey];

    }
    return self;
    }
    - (id)copyWithZone:(NSZone *)zone {
    MyClass *copy = [[[self class] allocWithZone:zone] init];
    copy.foo = [self.foo copyWithZone:zone];
    copy.bar = [self.bar copyWithZone:zone];
    copy.someInt = self.someInt;
    copy.someFloat = self.someFloat;
    return copy;
    }


    在存储四个textField的字符的例子中,Model代码如下

    #pragma mark NSCoding
    - (void)encodeWithCoder:(NSCoder *)encoder {
    [encoder encodeObject:field1 forKey:kField1Key];
    [encoder encodeObject:field2 forKey:kField2Key];
    [encoder encodeObject:field3 forKey:kField3Key];
    [encoder encodeObject:field4 forKey:kField4Key];
    }

    - (id)initWithCoder:(NSCoder *)decoder {
    if (self = [super init]) {
    field1 = [decoder decodeObjectForKey:kField1Key];
    field2 = [decoder decodeObjectForKey:kField2Key];
    field3 = [decoder decodeObjectForKey:kField3Key];
    field4 = [decoder decodeObjectForKey:kField4Key];
    }
    return self;
    }

    #pragma mark -
    #pragma mark NSCopying
    - (id)copyWithZone:(NSZone *)zone {
    BIDFourLines *copy = [[[self class] allocWithZone: zone] init];
    copy.field1 = [self.field1 copyWithZone:zone];
    copy.field2 = [self.field2 copyWithZone:zone];
    copy.field3 = [self.field3 copyWithZone:zone];
    copy.field4 = [self.field4 copyWithZone:zone];
    return copy;
    }

    依然在ViewController中定义两个方法:

    - (NSString *)dataFilePath;

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

    #define kFilename         @"archive"
    #define kDataKey @"Data"

    - (NSString *)dataFilePath {
    NSArray *paths = NSSearchPathForDirectoriesInDomains(
    NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
    }


    - (void)applicationWillResignActive:(NSNotification *)notification {
    BIDFourLines *fourLines = [[BIDFourLines alloc] init];
    fourLines.field1 = field1.text;
    fourLines.field2 = field2.text;
    fourLines.field3 = field3.text;
    fourLines.field4 = field4.text;

    NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
    initForWritingWithMutableData:data];
    [archiver encodeObject:fourLines forKey:kDataKey];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];
    }


    之后在viewDidLoad中实现:

    - (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:[self dataFilePath]];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
    initForReadingWithData:data];
    BIDFourLines *fourLines = [unarchiver decodeObjectForKey:kDataKey];
    [unarchiver finishDecoding];

    field1.text = fourLines.field1;
    field2.text = fourLines.field2;
    field3.text = fourLines.field3;
    field4.text = fourLines.field4;
    }

    UIApplication *app = [UIApplication sharedApplication];
    [[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(applicationWillResignActive:)
    name:UIApplicationWillResignActiveNotification
    object:app];
    }







  • 相关阅读:
    百度图片
    在线人数统计
    mysql简易导入excel
    asp.net 导出excel带图片
    C# 正则验证
    js生成随机数
    YQL获取天气
    取html里的img和去html标签
    客户端信息获得《转》
    使用ASP.NET上传图片汇总
  • 原文地址:https://www.cnblogs.com/mybkn/p/2419054.html
Copyright © 2011-2022 走看看