ios数据存储(一)

关于数据存储(一)
主要知识为下面5点:
1,plist文件:主要是用来存储array数据和dictionary数据
特性:只能够存储NSArray,NSDictionary,NSNumber,NSData,NSDate,NSString,BOOL七种数据类型的数据
2,设置存储:主要是用来存储小数据,最好是单个的小数据,主要使用在设置中
3,序列化(对象序列化/对象持久化):就是将一个对象转化二进制
步骤:如果对象存储,必须要序列化,获取必须要反序列化(已完整的对象序列化包括对象序列化和反序列化,在NSCoding协议里面都有)
4,sqlite
5,coreData

本次先实现前3个内容和沙盒知识的补充
1.plist文件

NSArray *array = @[@"123",@"456",@"789"];

    NSString *filePath = @"/Users/wangbing/Desktop/myPlist.plist";

    //atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
    //将数据写到对应的路径中,其中路径必须为绝对路径
    //如果多次存储数据,并不重新创建文件,而是更新文件的内容
    [array writeToFile:filePath atomically:YES];

2,设置存储

这里 //创建一个userDefaults对象
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    //获取Bool变量,setting是bool变量对应的标识符。如果没有,默认值NO
    BOOL b = [userDefaults boolForKey:@"setting"];

    if (!b) {
        //将数据存储到某个位置,setting是设置存储标识,如果取值的话,就是通过标识符来取值的
        //是固态存储,存储在硬盘当中,只要硬盘没坏,值一直存在
        //通过setting来识别,如果有的话,直接修改对应的值,如果没有的话,直接创建并保存
        [userDefaults setBool:YES forKey:@"setting"];

        //设置同步存储,默认是异步存储
        [userDefaults synchronize];
    }else{
        NSLog(@"有值");
    }

    //移除和setting对应的值
    [userDefaults removeObjectForKey:@"setting"];写代码片

3,序列化(对象序列化/对象持久化)和反序列化:
自定义对象是不能直接存入内存和文件中的,必须经过序列化才能存储
<1>要存的对象遵守NSCoding协议
<2>在要存的对象.m文件中实现下面两个方法

//  序列化
- (void)encodeWithCoder:(NSCoder *)aCoder{

    //将对象和其属性序列化,将对象和对象属性转化为二进制(name是对象的属性)
    [aCoder encodeObject:self.name forKey:@"name"];
}
//  反序列化
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{
    self = [super init];
    if (self) {

        //将对象和其属性反序列化,将二进制数据转化为对象和属性
        self.name = [aDecoder decodeObjectForKey:@"name"];
    }
    return self;
}

<3>具体的操作

    People *p = [[People alloc] init];

    //会触发对象序列化方法
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:p];
    //把序列化后的对象存入数组
    NSArray *array = @[@"123",@"456",@"789",data];
    //把数组存入plist文件中 ,@"/Users/wangbing/Desktop/myPlist.plist";是自己设定文件存储的绝对路径
    NSString *filePath = @"/Users/wangbing/Desktop/myPlist.plist";

    NSFileManager *fileManager = [NSFileManager defaultManager];

    if ([fileManager fileExistsAtPath:filePath]) {
        NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];

        //获取序列化的内容
        NSData *data = [arr lastObject];

        NSLog(@"data = %@",data);

        //对象反序列化
        id idValue = [NSKeyedUnarchiver unarchiveObjectWithData:data];
        NSLog(@"idValue = %@",idValue);

沙盒知识的补充:
沙盒:用来管理手机文件路径的工具叫做沙盒
作用:ios中绝大部分的数据保存路径都是在沙盒中(属于固态存储)
特性:从ios8之后,沙盒路径不再是一个静态不变的路径而是一个动态分配的路径
把数据存入沙盒 的2中方法

<1>

//把数据存入沙盒
//1,找到沙盒路径
    NSArray *pathesArray =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    //2,创建一个绝对路径
    NSString *path = [pathesArray firstObject];
    NSString *filePath = [path stringByAppendingPathComponent:@"Array.plist"];

    NSArray *array = @[@"123",@"456",@"789"];


    //atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
    //将数据写到对应的路径中,其中路径必须为绝对路径
    [array writeToFile:filePath atomically:YES];

    NSLog(@"%@",filePath);

<2>


 //是苹果系统中,用来管理一切沙盒的管理器
    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSArray *urlsArray = [fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask];

    NSURL *url = [urlsArray firstObject];

    //将url地址,转化为path路径
    NSString *path = [url path];

    //拼接绝对路径
    NSString *filePath = [path stringByAppendingPathComponent:@"tmp.plist"];

    NSLog(@"filePath = %@",filePath);

    //判断是否存在filePath路径,如果存在,删除掉
    if ([fileManager fileExistsAtPath:filePath]) {
//        [fileManager removeItemAtPath:filePath error:nil];
    }


    //将绝对路径转化为绝对URL地址
    NSURL *fileUrl = [NSURL fileURLWithPath:filePath];

    NSArray *array = @[@"123",@{@"key":@"value"},@"456",@"789"];


    //atomically:YES,考虑线程安全,影响性能。NO,不考虑线程安全,对性能没有影响
    //将数据写到对应的路径中,其中路径必须为绝对路径
    if ([array writeToURL:fileUrl atomically:YES]) {
        NSLog(@"存储成功");
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值