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

由于需求的关系,今天来讲讲数据的存储

沙盒

  • 拼接与方法
- (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

千万记得 此时要实现父类的方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值