您的位置:首页 > 其它

数据存储(沙盒,偏好,归档)

2015-11-01 23:37 405 查看
由于需求的关系,今天来讲讲数据的存储

沙盒

拼接与方法

- (IBAction)write {
NSArray *data=@[@"张三",@"李四",@"王五",@"赵六"];
//0.确定需要 写入的数据
NSString *sandBox=NSHomeDirectory();
NSString *docPath=[sandBox stringByAppendingPathComponent:@"Documents"]
//1.确定需要 写入到那个路径 下---沙盒路径
NSString *filePath=[docPath stringByAppendingPathComponent:@"names.plist"];
NSLog(@"%@",filePath);
//2.将数据写入到对应路径 下文件中
[data writeToFile:filePath atomically:YES];
}


写数据的时候,

NSString *docPath=[sandBox stringByAppendingPathComponent:@"Documents"]


这句代码,后期若随着版本的更新,可能会出现写不进的情况,所以不建议:

读取数据

- (IBAction)read{
//直接获取沙盒下的某个文件夹的全路径
//第一个参数是指要获取沙盒下的那一个文件 夹的目录
//第二个参数是说明 在沙盒那一个文件 夹下进行搜索  NSUserDomainMask是指从根路径下进行搜索
//第三个参数:是否展开所有路径
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath=[docPath stringByAppendingPathComponent:@"names.plist"];
NSLog(@"%@",docPath);
NSArray *arr=[NSArray arrayWithContentsOfFile:filePath];
for (NSString *name in arr) {
NSLog(@"%@",name);
}
}


缺点

使用对象: 仅仅是Foundation框架中的一些类, 比如: NSString\NSArray\NSDictionary\NSSet\NSNumber\NSData,对于其它数据类型不能直接存储。

偏好设置 读写

特点

使用”偏好设置”来存储数据, 本质上就是通过”plist”来存储数据, 但是使用起来更简单(无需关注文件、文件夹路径和名称)。

通过”偏好设置”的方式读、写文件时, 路径在”沙盒根目录” -> “Library” -> “Preferences”

写入

偏好设置实现数据写入
- (IBAction)myFovWrite {
/*
1.获取进行偏好设置读写数据的对象,这个对象 会将数据写入到沙盒的perfrence下,它的写入结果是一个xml文件
2.写入数据
3.立刻同步数据---真正立刻写入到文件
*/
NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
[userDefault setObject:@"张三" forKey:@"name"];
[userDefault setObject:@"18" forKey:@"age"];
[userDefault setBool:YES forKey:@"gender"];
[userDefault synchronize];
}


读取数据

- (IBAction)myFovRead {
/*
1.获取偏好设置读写对象
2.读取数据
*/
NSUserDefaults *userDefault=[NSUserDefaults standardUserDefaults];
NSString *name=[userDefault objectForKey:@"name"];
NSInteger age=[userDefault integerForKey:@"age"];
BOOL sex=[userDefault boolForKey:@"gender"];
}


缺点

通过”plist”文件来保存数据, 无法直接将一个对象保存到文件中。比如Person对象就没有writeToFile方法。而偏好设置只能存储少量数据,对于大数据存储不适合。

归档方式读写

“归档”是一种可以把任何对象, 直接保存为文件的方式。(其中包括”归档”与”反归档(读档)”)

前提

通过”归档”的方式来存储,对象必须遵守NSCoding协议,也就意味着通过”归档”的方式能将任何遵守了NSCoding协议的”对象”存储到文件中

NSCoding协议的两个重要的方法:

/*
作用: 对象归档时调用该方法(将对象写入文件时).
1> 说明哪些属性要存储
2> 说明如何存储这些属性
*/ 示例代码:
// 归档时调用该方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeDouble:self.height forKey:@"height"];
}


/**
** 作用: 当从文件中解析对象时调用该方法.
1> 说明哪些属性要解析(读取)
2> 说明如何解析(读取)这些属性
** 示例代码:
// 读档时调用该方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.height = [aDecoder decodeDoubleForKey:@"height"];
}
return self;
}


实现归档和反归档

归档

- (IBAction)achviWrite {
Student *stu=[[Student alloc] init];
stu.name=@"张三";
stu.email=@"zy1111@126.com";
stu.sex=YES;
stu.age=30;
stu.sid=@"110011";
NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath=[docPath stringByAppendingPathComponent:@"stu.pp”];
//归档操作
[NSKeyedArchiver archiveRootObject:stu toFile:filePath];
}


反归档

- (IBAction)achviRead {
NSString *docPath=   [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *filePath=[docPath stringByAppendingPathComponent:@"stu.pp”];
//反归档
Student *stu=[NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
}


有继承关系的归档与反归档

@implementation Student
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[super encodeWithCoder:aCoder];
[aCoder encodeObject:self.stuNo forKey:@"stuNo"];

}
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
if (self=[super initWithCoder:aDecoder]) {
self.stuNo=[aDecoder decodeObjectForKey:@"stuNo"];
}
return  self;
}
@end


千万记得 此时要实现父类的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据存储 沙盒