iOS开发中经常用到本地持久化的技术,本地持久化的方法也很多,常用方法有如下几种:

1.NSUserdaults (用户默认)

2.write to file (写文件)

3.NSkeyArchiver (归档解档)

4.SQLite (数据库)

5.core data (封装了SQLite)

因为本随笔主要是针对快速储存,所以相对繁琐的数据库类型就不做介绍了,如果想了解SQLite,亲关注鄙人的相关随笔.

  1.NSUserdaults (用户默认)

    这个方法是所有方法里最为简单的,因为通常你只需要一行代码存储,一行代码提取数据.但是对存储的数据类型有所限制,支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以.

    你看名字就能知道这个方法推荐让你存储一些用户的默认设置,比如:账户,密码,声音开关,震动开关等.但是不代表你不可以存储别的数据.

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     //定义字符串张三
 4     NSString * str = @"张三";
 5     //存储张三
 6     [[NSUserDefaults standardUserDefaults] setObject:str forKey:@"zhangsan"];
 7     //创建对象李四
 8     Lisi * lisi = [[Lisi alloc]init];
 9     //给李四名字赋值
10     lisi.name = @"李四";
11     //这里使用了李明杰老师的第三方框架,因为 NSUserDefaults 存储类型有限制,不能存储模型
12     NSMutableDictionary * dict = [lisi mj_keyValues];
13     //存储李四
14     [[NSUserDefaults standardUserDefaults] setObject:dict forKey:@"lisi"];
15 }
16
17 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
18     //读取数据
19     id person1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"zhangsan"];
20     id person2 = [[NSUserDefaults standardUserDefaults] objectForKey:@"lisi"];
21     //其实我们知道person1 是个字符串 , person2是个字典
22     NSLog(@"person1=%@ person2=%@",((NSString *)person1),[((NSMutableDictionary *)person2) objectForKey:@"name"]);
23 }

  2.write to file (写文件)

    这个方法的特点是数据写成一个文件,如果存得是字符串,可用文本编辑器打开,如果存得是其他类型,那么存得是一个xml文件.支持:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary. Mutable类型也可以.

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3     /**
 4      这里需要注意一下.持久化储存路径分为Documents,Library,Temp三个文件夹
 5      Documents文件夹会备份
 6      Library文件夹中的Preferences文件夹也会被备份.Caches文件夹不会被备份
 7      Tmp是临时文件,一般不往这个文件夹做持久化,这个文件夹会被系统自动清理
 8      */
 9     //我这里选择不会备份的Caches文件夹作为存储地址
10     NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
11     zhangsanFilePath = [caches stringByAppendingPathComponent:@"zhangsan"];
12     //输出文件夹路径
13     NSLog(@"caches=%@",caches);
14
15     NSString * str = @"张三";
16     NSError * error;
17     [str writeToFile:zhangsanFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
18     if (error) NSLog(@"error = %@",error);
19
20     //创建对象李四
21     Lisi * lisi = [[Lisi alloc]init];
22     //给李四名字赋值
23     lisi.name = @"李四";
24     //这里使用了李明杰老师的第三方框架,因为模型是没有writeToFile方法.
25     NSMutableDictionary * dict = [lisi mj_keyValues];
26     lisifilePath = [caches stringByAppendingPathComponent:@"lisi"];
27     [dict writeToFile:lisifilePath atomically:YES];
28 }
29
30 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
31     //读数据
32     //因为你知道存储类型,所以读数据用类方法
33     NSString * zhangsan = [NSString stringWithContentsOfFile:zhangsanFilePath encoding:NSUTF8StringEncoding error:nil];
34     NSLog(@"zhangsan=%@",zhangsan);
35
36     NSDictionary * lisi = [NSDictionary dictionaryWithContentsOfFile:lisifilePath];
37     NSLog(@"lisi=%@",[lisi objectForKey:@"name"]);
38 }

  3.NSkeyArchiver (归档解档)

    这种方法的特点是能够存储模型(前面两种储存模型时都需要转成字典),需要模型遵守NSCoding协议,还要重写encodeWithCoder和initWithCoder方法.

 1 //归档
 2 - (void)encodeWithCoder:(NSCoder *)aCoder {
 3     [aCoder encodeObject:_name forKey:@"NAME"];
 4 }
 5 //解档
 6 - (instancetype)initWithCoder:(NSCoder *)aDecoder {
 7     self = [super init];
 8     if (self) {
 9         _name = [aDecoder decodeObjectForKey:@"NAME"];
10     }
11     return self;
12 }

    到这里准备工作做完了,然后进行存储和读取操作.这里也需要传路径

 1 - (void)viewDidLoad {
 2     [super viewDidLoad];
 3
 4     NSString * caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).lastObject;
 5     NSLog(@"caches=%@",caches);
 6     lisifilePath = [caches stringByAppendingPathComponent:@"lisi"];
 7
 8     Lisi * lisi = [[Lisi alloc]init];
 9     lisi.name = @"李四";
10     //归档
11     BOOL isSuccess = [NSKeyedArchiver archiveRootObject:lisi toFile:lisifilePath];
12     if (isSuccess) NSLog(@"success");
13
14 }
15
16 - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
17     //解档
18     Lisi * lisi = [NSKeyedUnarchiver unarchiveObjectWithFile:lisifilePath];
19     NSLog(@"lisi=%@",lisi.name);
20 }

    总结:这三种持久化方法都各有特色,NSUserDaults适合配置文件,WriteToFile适合存储大数据,归档适合存储模型.

转载于:https://www.cnblogs.com/huyp/p/5148965.html

iOS 快速存储到本地相关推荐

  1. file上传代码 ios_iOS视频压缩存储至本地并上传至服务器实例代码

    最近做了一个项目,我把其中的核心功能拿出来和大家分享一下,重点还是自己梳理一下. 这里关于视频转码存储我整理了两个方法,这两个方法都是针对相册内视频进行处理的. 1.该方法没有对视频进行压缩,只是将视 ...

  2. 图片提取利器,从PDF中快速提取图片并存储到本地

    PDF是日常生活中经常使用的文件格式,里面可能包含着重要的文字信息和图片资源.然而当需要提取PDF中的图片时,往往需要使用复杂的工具.图片提取利器能够帮助你从PDF中快速提取图片并存储到本地. # c ...

  3. iOS应用架构谈-本地持久化方案及动态部署

    iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...

  4. 工作中搜索页面搜索记录功能的封装(存储到本地)

    //!*封装添加搜索记录功能 (newRecord:str,当参数为空时为获取历史记录; num:记录数,默认为12条;) function addHisRecord(newRecord, num){ ...

  5. iOS 快速定位约束冲突

    iOS 快速定位约束冲突 什么是约束冲突 当你使用 AutoLayout 布局,你添加的约束不满足或者会造成系统布局冲突的时候,控制台就会打印冲突日志. 约束冲突示例 [LayoutConstrain ...

  6. iOS快速开发框架--Bee Framework

    Bee Framework是一款iOS快速开发框架,允许开发者使用Objective-C和XML/CSS来进行iPhone和iPad开发,由Gavin Kwoe和QFish开发并维护. 其早期原型曾经 ...

  7. iOS 快速实现分页界面的搭建

    级别: ★★☆☆☆ 标签:「iOS」「分页」「QiPageMenuView」 作者: 沐灵洛 审校: QiShare团队 iOS 快速实现分页界面的搭建 项目中我们经常会遇到滚动分页的设计效果,被用来 ...

  8. 前端学习(1043):回车把数据存储到本地存储里面

    <!DOCTYPE html> <html lang="en"><head><meta charset="UTF-8" ...

  9. 安卓androidstudio访问本地接口_安卓开发之数据存储在本地的四种方式

    ​ 安卓开发之数据存储在本地的四种方式 本地数据存储,在安卓开发过程中是不可避免的一个话题.这些本地的数据可能是用户的设置,程序的设置,用户的数据图片, 也可能是网络传输的一些缓冲数据. 基本上我们有 ...

最新文章

  1. c语言用fread读取全部文本,C中用fread()从文件读取数据问题
  2. easyui的datagrid的使用记录
  3. 07-Windows Server 2012 R2 会话远程桌面-标准部署-RD授权
  4. [改善Java代码]性能考虑,数组是首选
  5. linux教程第五版第三章课后答案,linux 第三章 章习题.doc
  6. Unsupported major.minor version 52.0解决
  7. 数据结构与算法学习笔记01-数组
  8. 《简明Python教程》--沈洁元
  9. 蓝桥杯练习 杨辉三角形
  10. stm32摄像头调试 | 串口传输照片数据 | 用python来设计上位机通信软件
  11. 库存管理中常见的5大问题
  12. 数据结构:查找与排序
  13. HEU Monkey CC
  14. codeforces日常训练 C. Cutting Out - 二分搜索答案
  15. OpenGL南邮计算机图形学实验报告二——两个纹理的渐变变换和移动
  16. 文化先锋A6客户端自动登陆
  17. IDEA 添加类注释、方法注释(快捷键 /** + Enter)
  18. 基本尺寸,实际尺寸,作用尺寸,极限尺寸,最大实体尺寸,最小实体尺寸
  19. Vue CSS 穿透 scoped (>>> || /deep/ )
  20. 支付宝小程 rich-text标签不显示问题解决

热门文章

  1. 《高性能Linux服务器构建实战》笔记
  2. 如何实现报表设计中的高精度报表套打?
  3. 关于安卓录屏的权限问题
  4. insertionSortList
  5. 企业数据移动服务管理软件SAP
  6. 换个角度看“Q币门”事件
  7. 利用现有资源快速实现汉语专用分词系统
  8. 【转】PHP获取重定向URL的几种方法
  9. 几十条业务线日志系统如何收集处理?
  10. 【selenium 3】 Mac 下测试环境搭建 Firefox 47+ gecko driver Mac