iOS数据持久化
//
// ViewController.m
// 数据持久化
//
// Created by fhefh on 16/3/13.
// Copyright © 2016年 fhefh. All rights reserved.
//
#import "ViewController.h"
@interface Person:NSObject<NSCoding>
/**
* 姓名
*/
@property (nonatomic, copy) NSString *name;
/**
* 年龄
*/
@property (nonatomic, copy) NSString *age;
@end
@implementation Person
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeObjectForKey:@"age"];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.age forKey:@"age"];
}
@end
@interface ViewController ()
@property (nonatomic, copy) NSString *path;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//沙盒存储路径
self.path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
}
- (IBAction)saveButton {
[self saveArchiver];
}
- (IBAction)readButton {
[self readArchiver];
NSLog(@"%@", self.path);
}
/**
plist文件
plist文件是将某些特定的类,通过XML文件的方式保存在目录中。
可以被序列化的类型只有如下几种:
NSArray
NSMutableArray
NSDictionary
NSMutableDictionary
NSData
NSMutableData
NSString
NSMutableString
NSNumber
NSDate
只有以上列出的类型才能使用plist文件存储。
存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
读取时使用arrayWithContentsOfFile:方法。
*/
//plist存储
- (void)savePlist {
NSString *fileName = [self.path stringByAppendingPathComponent:@"data.plist"];
NSArray *data = @[@"1", @"2", @"3"];
[data writeToFile:fileName atomically:YES];
}
//plist读取
- (void)readPlist {
NSString *fileName = [self.path stringByAppendingPathComponent:@"data.plist"];
NSArray *data = [NSArray arrayWithContentsOfFile:fileName];
NSLog(@"%@", data);
}
/**
Preference
偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。
*/
//Preference存储
- (void)readPreference {
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
[user setValue:@"19" forKey:@"age"];
[user setValue:@"jack" forKey:@"name"];
[user synchronize];
}
//Preferencex读取
- (void)savePreference {
NSUserDefaults *user = [NSUserDefaults standardUserDefaults];
NSString *name = [user objectForKey:@"name"];
NSString *age = [user objectForKey:@"age"];
NSLog(@"name is %@, age is %@", name, age);
}
//NSKeyedArchiver
/**
归档在iOS中是另一种形式的序列化,只要遵循了NSCoding协议的对象都可以通过它实现序列化。由于决大多数支持存储数据的Foundation和Cocoa Touch类都遵循了NSCoding协议,因此,对于大多数类来说,归档相对而言还是比较容易实现的。
1.遵循NSCoding协议
NSCoding协议声明了两个方法,这两个方法都是必须实现的。一个用来说明如何将对象编码到归档中,另一个说明如何进行解档来获取一个新对象。
特别注意如果需要归档的类是某个自定义类的子类时,就需要在归档和解档之前先实现父类的归档和解档方法。即 [super encodeWithCoder:aCoder] 和 [super initWithCoder:aDecoder] 方法;
2.使用需要把对象归档是调用NSKeyedArchiver的工厂方法 archiveRootObject: toFile: 方法。
3.注意
必须遵循并实现NSCoding协议
保存文件的扩展名可以任意指定
继承时必须先调用父类的归档解档方法
*/
//NSKeyedArchiver存储
- (void)saveArchiver {
NSString *fileName = [self.path stringByAppendingPathComponent:@"save.data"];
Person *p = [[Person alloc] init];
p.name = @"jack";
p.age = @"19";
[NSKeyedArchiver archiveRootObject:p toFile:fileName];
}
//NSKeyedArchiver读取
- (void)readArchiver {
NSString *fileName = [self.path stringByAppendingPathComponent:@"save.data"];
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:fileName];
NSLog(@"%@", p);
}
@end