• iOS初级数据持久化 沙盒机制 归档与反归档


    数据持久化就是数据保存成文件,存储到程序中的沙盒中.

    沙盒构成

    Document 存储用户数据,需要备份的信息

    Caches 缓存文件, 程序专用的支持文件

    Temp 临时文件

    通过代码查找程序沙盒的相对路径

    NSArray *documentsPathArry NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *document = [documentsPathArry lastObject];
       NSLog(@"%@", document);
            //   缓存文件夹路径
       NSArray *cachesPatharray = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
       
    NSString *cachespath = cachesPatharray[0];
       
    NSLog(@"%@", cachespath);
       
          // 打印temp文件夹  
        // 该文件夹一般存储 临时文件夹
       
    NSString *tempPath = NSTemporaryDirectory();
       
    NSLog(@"%@", tempPath);
             // 打印沙盒主目录路径  NSHomeDirectory()
        NSString *homePath = NSHomeDirectory();
        NSLog(@"%@", homePath);
    // 简单对象写入文件
    // 注意 :如果你写入字典或者数组 那么数组字典中存储的数据必须是简单对象 无法写入复杂对象
    - (
    void)writeFile
    {
       
    // 简单对象
       
    // 字符串 字典 数组 data...系统写好的类
       
    // 写入文件的路径
       
    // 写入documents 路径下写入xiaoshuo.text
       
    NSArray *documentsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
       
    NSString *document = documentsArray[0];
       
    NSString *path = [document stringByAppendingString:@"/xiaoshuo.text"];
       
    NSString *str = @"第一章 在一个月黑风高的早上";
       
       
    // atomically 如果yes 在你写入的过程中出现程序崩溃 不影响写入
        [str
    writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:nil];
       
    NSLog(@"%@", path);
       
       
    // 简单拼接对象写入步骤
       
    // 1.拼接要写入的路径 (注意的路径一定要拼接对)
       
    // 2. 调用写方法完事
       
       
    // 写入一个数组 shuzu.plist
       
    // 必须给后缀类型 你不给呢 就默认是text格式
       
    NSString *arrPath = [document stringByAppendingPathComponent:@"shuzu.plist"];
       
    NSArray *array = @[@"永乐", @"永飞", @"哈哈"];
       
    // 调用写入方法
        [array
    writeToFile:arrPath atomically:YES];
       
    NSLog(@"%@", arrPath);
       
       
    // 写入一个字典 zidian.plist
       
    NSString *dicPath = [document stringByAppendingPathComponent:@"zidian.plist"];
       
    NSDictionary *dic = @{@"name": @"xiaofang"};
        [dic
    writeToFile:dicPath atomically:YES];
       
    NSLog(@"%@", dicPath);
       
       
    // data的写入 后缀.da
       
    NSString *dataPath = [document stringByAppendingPathComponent:@"data.da"];
       
    NSString *dataStr = @"你猜我是谁";
       
    NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
       
    // 写入文件
        [data
    writeToFile:dataPath atomically:YES];
       
    NSLog(@"%@", dataPath);
       
       
    // 复杂对象
       
    // 自定义的类 比如person
    }
    // 读取写入的文件
    - (
    void)readingFile
    {
       
    // 读字符串
       
    // 获取路径
       
    NSArray *documentsArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
       
    NSString *document = documentsArray[0];
       
    NSString *path = [document stringByAppendingString:@"/xiaoshuo.text"];
       
       
    // 从路径中读取字符串
       
    NSString *str = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];
       
    NSLog(@"%@", str);
       
       
    // 读取数组的文件
       
    NSString *arrPath = [document stringByAppendingPathComponent:@"shuzu.plist"];
       
    // 获取路径
       
    NSArray *array = [NSArray arrayWithContentsOfFile:arrPath];
       
    NSLog(@"%@", array);
       
       
    // 读取字典
       
    // 获取路径
       
    NSString *dicPath = [document stringByAppendingPathComponent:@"zidian.plist"];
       
    NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:dicPath];
       
    NSLog(@"%@", dic);
       
       
    // 读取data
       
    NSString *dataPath = [document stringByAppendingPathComponent:@"data.da"];
       
    NSData *data = [NSData dataWithContentsOfFile:dataPath];
       
    // data转化为字符串
       
    NSString *dataStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
        NSLog(@"%@", dataStr);
    }
    复杂对象归档与反归档  对复杂对象进行持久化 叫做归档与反归档 (编码与解码)
    创建一个model类


    .

    NSFileManager文件管理者 这个类 是个单例类 用来对文件夹进行操作

    // 创建一个文件夹
    - (
    void)createFile
    {
       
    // 需求 documents下创建一个Download文件夹
       
    NSArray *documentsArr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
       
    NSString *doucumentPath = documentsArr[0];
       
    // 拼接路径
       
    NSString *downloadPath = [doucumentPath stringByAppendingPathComponent:@"Download"];
       
    NSLog(@"%@", downloadPath);
       
       
    // 创建文件夹
       
    // 文件管理者 这个类 是个单例类 用来对文件夹进行操作
       
    NSFileManager *manager = [NSFileManager defaultManager];
       
       
    // withIntermediateDirectories
       
    // 如果yes情况下 要创建的文件 存在的话 可以对其覆盖
       
    // 反之 文件存在的话 不能对其覆盖 (创建失败)
       
       
    BOOL isCreatFile = [manager createDirectoryAtPath:downloadPath withIntermediateDirectories:YES attributes:nil error:nil];
       
    NSLog(@"%d", isCreatFile);
       
    }
    // 宏定义
    #define kDocumentPath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]

    #define kCachesPath [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]

    // 移动文件夹
    - (
    void)moveFile
    {
       
    // 获取原来的路径
       
    NSString *oldPath = [kDocumentPath stringByAppendingPathComponent:@"Download"];
       
    // 获取新路径 libray 下的Caches 文件夹
       
    NSString *newPath = [kCachesPath stringByAppendingPathComponent:@"Download"];
       
    // 创建 文件管理者类的对象(单例对象)
       
    NSFileManager *manager = [NSFileManager defaultManager];
       
    // 移动文件夹
      
    BOOL isMoved = [manager moveItemAtPath:oldPath toPath:newPath error:nil];
       
    NSLog(@"%d", isMoved);
    }
    // 复制文件夹
    - (
    void)copyFile
    {
      
    // libaray 下的Caches 文件夹 download 复制到document文件夹下
       
    NSString *oldPath = [kCachesPath stringByAppendingPathComponent:@"download"];
       
    NSString *newPath = [kDocumentPath stringByAppendingPathComponent:@"downLoad"];
       
    // 创建文件管理对象
       
    NSFileManager *manager = [NSFileManager defaultManager];
       
    // 复制
       
    BOOL isCopy = [manager copyItemAtPath:oldPath toPath:newPath error:nil];
       
    NSLog(@"%d", isCopy);
    }
    // 删除文件夹
    - (
    void)deleteFile
    {
       
    // 获取要删除的路径
       
    NSString *deletePath = [kDocumentPath stringByAppendingPathComponent:@"Download"];
       
    // 创建文件管理对象
       
    NSFileManager *manager = [NSFileManager defaultManager];
       
    BOOL isDelete = [manager removeItemAtPath:deletePath error:nil];
       
    NSLog(@"%d", isDelete);
    }
    // 判断文件夹是否存在
    - (
    void)isExistFile
    {
       
    // 获取 要判断的路径
       
    NSString *path = [kCachesPath stringByAppendingPathComponent:@"download"];
       
    // 创建文件管理对象
       
    NSFileManager *manager = [NSFileManager defaultManager];
       
    BOOL isExist = [manager isExecutableFileAtPath:path];
       
    NSLog(@"%d", isExist);
    }

    // 复杂对象归档
    - (
    void)archiver
    {
       
    // 初始化对象
       
    JJModel *model = [[JJModel alloc] init];
       
    // 赋值对象
        model.
    name = @"MJJ";
        model.
    age = 49;
       
    // 图片
       
    // 把一个png格式转化成data
        model.
    data = UIImagePNGRepresentation([UIImage imageNamed:@"IMG_1873"]);
       
    NSMutableData *data = [NSMutableData data];
       
    // 创建一个归档对象
       
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
       
    // 进行归档编码
        [archiver
    encodeObject:model forKey:@"JJModel"];
       
    // 编码完成
        [archiver
    finishEncoding];
       
    // 实际上归档 相当于把编码完的对象保存data
    //    NSLog(@"---------%@", data);
       
    // 把存有复杂对象的文件data 写入文件中 进行持久化
       
    // 搞路径
       
    NSString *dataPath = [kDocumentPath stringByAppendingPathComponent:@"JJmodel.da"];
    //    NSLog(@"=======%@", dataPath);
       
    // 调入写入方法
        [data
    writeToFile:dataPath atomically:YES];
       
    // 释放归档对象
        [archiver
    release];
    }
    // 反归档 (解码的过程)
    - (
    void)unArchiver
    {
       
    // 搞路径
       
    NSString *path = [kDocumentPath stringByAppendingPathComponent:@"JJModel.da"];
       
    // 获取刚才归档的data
       
    NSData *data = [NSData dataWithContentsOfFile:path];
       
    // 创建 反归档对象
       
    NSKeyedUnarchiver *unArchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
       
       
    // 解码 返回一个对象 应该是JJModel
       
    // 这个key 一定要和刚才归档的时候的key一致
       
    JJModel *model = [unArchiver decodeObjectForKey:@"JJModel"];
       
    // 反归档完成
        [unArchiver
    finishDecoding];
       
    // 释放反归档对象
        [unArchiver
    release];
       
    NSLog(@"%@", model);
       
    UIImage *image = [UIImage imageWithData:model.data];
       
    }

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    ES6之6种遍历对象属性的方法
    css自定义滚动条样式,自定义文字选择样式,设置文字不被选择
    js img转换base64
    移动端rem造成的很多问题
    移动端边框1像素的问题
    【小练习1】如何制作“表单”
    2015-09-24 第六节课 (CSS补充和html 标签讲解、浏览器兼容性)
    2015-09-22 第四节课 CSS块级元素 行内元素 浮动 盒子模型 绝对定位、相当定位和固定定位
    2015-09-21 第三节课 css属性 border(边框)、background(背景)
    html你可能还不知道的一些知识点
  • 原文地址:https://www.cnblogs.com/pp123/p/4814577.html
Copyright © 2020-2023  润新知