数据存储(沙盒,偏好,归档)
2015-11-01 23:37
405 查看
由于需求的关系,今天来讲讲数据的存储
写数据的时候,
这句代码,后期若随着版本的更新,可能会出现写不进的情况,所以不建议:
读取数据
缺点
使用对象: 仅仅是Foundation框架中的一些类, 比如: NSString\NSArray\NSDictionary\NSSet\NSNumber\NSData,对于其它数据类型不能直接存储。
使用”偏好设置”来存储数据, 本质上就是通过”plist”来存储数据, 但是使用起来更简单(无需关注文件、文件夹路径和名称)。
通过”偏好设置”的方式读、写文件时, 路径在”沙盒根目录” -> “Library” -> “Preferences”
写入
读取数据
缺点
通过”plist”文件来保存数据, 无法直接将一个对象保存到文件中。比如Person对象就没有writeToFile方法。而偏好设置只能存储少量数据,对于大数据存储不适合。
前提
通过”归档”的方式来存储,对象必须遵守NSCoding协议,也就意味着通过”归档”的方式能将任何遵守了NSCoding协议的”对象”存储到文件中
NSCoding协议的两个重要的方法:
实现归档和反归档
归档
反归档
有继承关系的归档与反归档
千万记得 此时要实现父类的方法
沙盒
拼接与方法- (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
千万记得 此时要实现父类的方法
相关文章推荐
- 微软发布令牌漏洞公告:可绕过 Chromium 沙盒执行任意代码
- 一些关于数据存储和查询优化的想法
- 正确面对服务器数据存储防止数据丢失
- 高性能Javascript笔记 数据的存储与访问性能优化
- 在android开发中进行数据存储与访问的多种方式介绍
- Python使用shelve模块实现简单数据存储的方法
- android中使用SharedPreferences进行数据存储的操作方法
- Android基础——数据存储
- Android实现数据存储5种技术
- Android数据的四种存储方式
- LUN 是个什么东西
- 编程狂人第三十一期
- 编程狂人第三十三期,程序员必读的技术周刊
- iOS沙盒(sandbox)机制及获取沙盒路径
- Android数据储存——SharedPreferences储存
- android中数据存储的ContentProvider的使用方法
- iOS应用数据存储的常用方式(一)
- iOS应用数据存储的常用方式 (二)
- ios新手沙盒 通知
- 数据库索引