IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> [iOS开发]iOS持久化 -> 正文阅读

[移动开发][iOS开发]iOS持久化

沙盒机制

之前在真机测试查找录音文件的时候我们已经有了解过沙盒机制

// 获取沙盒根目录路径
    NSString *homeDir = NSHomeDirectory();

在这里插入图片描述

  • Documents存放的是app数据库文件
    在 iOS11 以后新增了一个 文件 APP,集中管理 iOS 上应用内创建的文件,以及各个云盘服务中保存的文件。在 iOS 工程 info.plist 中设置 Application supports iTunes file sharingSupports opening documents in place这两个选项为 YES(默认为 NO),就可以将该应用的沙盒 Documents路径下的文件暴露在文件 APP 中。
  • Library 默认存放设置和其他状态信息。除了caches子目录之外其他目录都会被iclude同步
    • Application Support 此目录包含应用程序用来运行但应对用户隐藏的文件,如游戏的新关卡等文件。
    • Caches保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据,如网络请求的音视频与图片等的缓存。在 iOS 5.0 及以后版本中,Caches 当系统磁盘空间非常低时,系统可能会在极少数情况下该删除目录(APP 正在运行时不会发生),所以尽量保证该路径的文件在 APP 在重新运行时可以得到重新创建。
    • Cooikes系统会自动将App中网络请求的cookie保存为文件
    • Preferences保存应用的所有偏好设置。UserDefaults生成的plist文件就会保存该目录下。
    • SplashBoard存储启动屏缓存,缓存文件格式为 ktx,本质上就是图片,如果启动屏不生效的问题可以考虑从删除该路径下相关缓存文件这个角度解决;
    • WebKit存储 WKWebView 相关的一些数据,如 IndexDB、LocalStorage、WebSQL 等;
  • SystemData存放系统数据,无对外暴露的接口
  • tmp 保存临时文件,后序不需要使用

持久化数据存储的方式

XML属性列表(plist)

属性列表是一种XML格式的文件,拓展名为plist

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用
writeToFile:atomically:方法直接将对象写到属性列表文件中

我们需要手动写个目录

NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

NSString * filePath = [docPath stringByAppendingPathComponent:@"xx.plist"];

// NSDocumentDirectory : 搜索哪个文件夹
// NSUserDomainMask : 在哪搜索
// atomically:线程安全的

// 存字典

NSDictionary* dict = @{ @"key" :@"value", @"key1" : @"value1" };

[dict writeToFile:filePath atomically:YES];

// 取字典

NSDictionary* dict = [NSDictionary dictionaryWithContentsOfFile:filePath];

NSLog(@"%@", dict);


// 存数组
NSArray* array = @[ @"123123",@"111111" ];
[array writeToFile:filePath atomically:YES];

// 取数组
NSArray* array = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@", array); 

在这里插入图片描述

在这里插入图片描述

Preferences偏好设置(UserDefaults)

很多iOS应用都支持偏好设置,提供了一套标准的解决方案来为应用加入偏好设置功能,比如保存用户名,字体大小,密码,是否自动登录等。

特点:不会自动删除,iclude\itune同步,不适合存大数据。即时操作需要注意同步问题,不需要设置路径和文件名

其本身的创建类似于单例模式 我们在后面用不同的属性名再次申请创建,会覆盖之前的数据

我们使用UserDefaults注册一个账号密码试一下

    // 获取偏好设置对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    //存储数据
    [defaults setObject:_nameTextField.text forKey:@"name"];
    [defaults setObject:_passwordTextField.text forKey:@"password"];
    
    // 同步调用,立刻写到文件中,不写这个方法会异步,有延迟
    [defaults synchronize];


//需要验证账号密码的地方
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    NSString *name = [defaults objectForKey:@"name"];
    
    NSString *password = [defaults objectForKey:@"password"];

在这里插入图片描述
在这里插入图片描述

NSKeyedArchiver归档

  • 如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和恢复
    在这里插入图片描述

  • 特点:存入Document,不会自动删除,可存放大型数据,iclude/iTune同步,存放用户产生的数据,如游戏,操作记录等等。

  • 不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSS ecureCoding协议的对象才可以。NSSecureCoding也遵循了原来NSCoding这个协议,不过我们还需要遵循一个supportsSecureCoding方法

  • NSCoding有两个方法:

    • encodeWithCoder
      每次归档对象时,都会调用这个方法。一般在这个方法里面指定如何归档对象中的每个实例变量。可以使用encodeObject:forKey:方法归档实例变量
    • initWithCoder
      每次从文件中会恢复(解码)对象时,都会调用这个方法。一般在这个方法里面指定如何解码文件中的数据为对象的实例变量,可以使用decodeObject:forKey方法解码实例变量

- (void)encodeWithCoder:(NSCoder *)coder {
    [coder encodeObject:_name forKey:@"name"];
    [coder encodeInt:_age forKey:@"age"];
}

- (id)initWithCoder:(NSCoder *)coder {
    if(self = [super init]) {
        _name = [coder decodeObjectForKey:@"name"];
        _age = [coder decodeIntForKey:@"age"];
    }
    return self;
}

+ (BOOL)supportsSecureCoding {

    return YES;

}

归档

- (void)save {
    // 1.新的模型对象
    Person *person = [[Person alloc] init];
    person.name = @"young_jerry";
    person.age = 18;
    NSError *error;
    // 2.归档模型对象
    // 2.1获得Documents的全路径
    NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    // 2.2获得文件的全路径
    NSString *path = [docu stringByAppendingString:@"p.data"];
    // 2.3将对象归档
    //[NSKeyedArchiver archiveRootObject:p toFile:path];
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person requiringSecureCoding:YES error:&error];
    if(error) {
        NSLog(@"sodufosuf%@", error);
    }
    [data writeToFile:path atomically:YES];
}

读档

- (void)read {
   NSError *error;
   // 1获得Documents的全路径
   NSString *docu = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
   // 2获得文件的全路径
   NSString *path = [docu stringByAppendingString:@"p.data"];
   NSData *unData = [NSData dataWithContentsOfFile:path];
   // 3.从文件中读取Person对象
   Person *person = (Person *)[NSKeyedUnarchiver unarchivedObjectOfClass:[Person class] fromData:unData error:&error];
   // 打印结果
   NSLog(@"%@--%d",person.name,person.age);
}
							·		

通过SQlite或CoreData保存在对象数据集

SQlite就是一个轻量级的数据库

CoreData是苹果推出的一个数据存储框架。CoreData提供了一种对象关系映射(ORM)的存储关系,类似于Java的hibernate框架。CoreData可以将OC对象存储到数据库中,也可以将数据库中的数据转化为OC对象,在这个过程中不需要手动编写任何SQL语句,CoreData封装了数据库的操作过程,以及数据库中数据和OC对象的转换过程。 所以在使用CoreData的过程中,很多操作就像是对数据库进行操作一样,也有过滤条件、排序等操作。

这就相当于CoreData完成了Model层的大量工作,例如Model层的表示和持久化,有效的减少了开发的工作量,使Model层的设计更加面向对象

SQLite和CoreData的区别

  • CoreData可以在一个对象更新时,其关联的对象也会随着更新,相当于你更新一张表时,其关联的其他表的也回随着更新
  • CoreData供更简单的性能管理机制,可以限制查询记录的总数,这个类会自动更新其缓存
  • 多表查询方面,CoreData没有SQL直观,没有类似外连接,左连接等操作.
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-08 11:27:20  更:2021-08-08 11:28:41 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 11:12:34-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码