数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)
-
ios中常用文件存取的方法有:
1、直接写文件的方式,可以存储的对象有NSString、NSArray、NSDictionary、NSData、NSNumber,数据全部存放在一个属性列表文件(*.plist文件)中。
2、NSUeserDefaults(偏好设置),用来存储应用设置信息,文件放在perference目录下。
3、归档操作(NSkeyedArchiver),不同于前面两种,它可以把自定义对象存放在文件中。
首先每个开发者都应该知道,对于一个应用来说,有唯一的沙盒与之对应,即每个应用不能跨沙盒操作文件。
一、获取沙盒路径,通过写文件的方式存储数据
直接来看代码:
- #import "ViewController.h"
- @interface ViewController ()
- @end
- @implementationViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- // Do any additional setup after loading the view,typically from a nib.
- [self mainOperation];
- }
- - (void)mainOperation
- {
- //获取沙盒中缓存文件夹路径
- //方法一
- //沙盒主目录
- NSString *homePath = NSHomeDirectory();
- //拼接路径
- NSString *path = [homePath stringByAppendingPathComponent:@"Library/Caches"];
- //方法二
- //第一个参数目标文件夹目录(NSCachesDirectory查找缓存文件夹),第二个参数为查找目录的域(NSUserDomainMask为在用户目录下查找),第三个参数为结果中主目录是否展开,不展开则显示为~
- NSArray *arr = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
- //虽然该方法返回的是一个数组,但是由于一个目标文件夹只有一个目录,所以数组中只有一个元素。
- NSString *cachePath = [arr lastObject];
- //或者
- // NSString *cachePath = [arr objectAtIndex:0];
- /**
- //获取沙盒中Document文件夹或者tmp文件夹路径都可使用上面两种方法
- //tmp文件夹路径可直接这样获取
- NSString *tmpPath = NSTemporaryDirectory();
- NSLog(@"%@",tmpPath);
- **/
- //拼接路径(目标路径),这个时候如果目录下不存在这个lotheve.plist文件,这个目录实际上是不存在的。
- NSString *filePath = [cachePath stringByAppendingPathComponent:@"tese.plist"];
- NSLog(@"%@",filePath);
- //创建数据
- NSDictionary *content = @{@"字典数据测试1":@"1",@"字典数据测试2":@"2",@"字典数据测试":@"3"};
- //将数据存到目标路径的文件中(这个时候如果该路径下文件不存在将会自动创建)
- //用writeToFile方法写文件会覆盖掉原来的内容
- [content writeToFile:filePath atomically:YES];
- //读取数据(通过字典的方式读出文件中的内容)
- NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
- NSLog(@"%@",dic);
- }
- @end
沙盒中Library/Caches目录下多了lotheve.plist文件
文件内容:
二、使用NSUeserDefaults(偏好设置)实现数据存储
每个应用都有一个NSUesrDefaults实例,通过它可以存储应用配置信息以及用户信息,比如保存用户名、密码、字体大小、是否自动登录等等。数据自动保存在沙盒的Libarary/ Preferences目录下。同样,该方法只能存取NSString、NSArray、NSDictionary、NSData、NSNumber类型的数据。
代码示例:
- #import "LXXViewController.h"
- @interface LXXViewController ()
- @end
- @implementationLXXViewController
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- self.title = @"NSUserDefaults Demo";
- }
- //点击button保存数据
- - (IBAction)saveData:(id)sender {
- //获取NSUserDefaults对象
- NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
- //存数据,不需要设置路劲,NSUserDefaults将数据保存在preferences目录下
- [userDefaults setObject:@"Lotheve" forKey:@"name"];
- [userDefaults setObject:@"NSUserDefaults" forKey:@"demo"];
- //立刻保存(同步)数据(如果不写这句话,会在将来某个时间点自动将数据保存在preferences目录下)
- [userDefaults synchronize];
- NSLog(@"数据已保存");
- }
- //点击button读取数据
- - (IBAction)getData:(id)sender
- {
- //获取NSUserDefaults对象
- NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
- //读取数据
- NSString *name = [userDefaults objectForKey:@"name"];
- NSString *demo = [userDefaults objectForKey:@"demo"];
- //打印数据
- NSLog(@"name = %@ demo =%@",name,demo);
- }
- @end
Interface Building中设置了两个按钮:
点击“保存数据”后,查看沙盒中的Libarary/ Preferences目录:
数据以plist的格式写入磁盘中了。点开查看数据:
三、NSKeyedArchiver(归档操作)
使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。
代码示例:
需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现
- - (void)encodeWithCoder:(NSCoder *)aCoder
- - (id)initWithCoder:(NSCoder *)aDecoder
1、文件结构:
2、代码示例:
LXXViewController.m
- #import "LXXViewController.h"
- #import "TestPerson.h"
- @interface LXXViewController ()
- @property (nonatomic ,strong) TestPerson *p;
- @end
- @implementationLXXViewController
- - (void)viewDidLoad {
- [super viewDidLoad];
- }
- - (IBAction)saveData:(id)sender
- {
- //创建一个自定义类的实例
- _p = [[TestPerson alloc]init];
- _p.name = @"Lotheve";
- _p.age = 20;
- _p.sex = @"m";
- _p.familyMumbers = @[@"Father",@"Mather",@"Me"];
- //获取文件路径
- NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
- //文件类型可以随便取,不一定要正确的格式
- NSString *targetPath = [docPath stringByAppendingPathComponent:@"lotheve.plist"];
- //将自定义对象保存在指定路径下
- [NSKeyedArchiver archiveRootObject:_p toFile:targetPath];
- NSLog(@"文件已储存");
- }
- - (IBAction)getData:(id)sender
- {
- //获取文件路径
- NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
- NSString *targetPath = [docPath stringByAppendingPathComponent:@"lotheve.plist"];
- TestPerson *person = [NSKeyedUnarchiver unarchiveObjectWithFile:targetPath];
- NSLog(@"name = %@ , age =%ld , sex = %@ , familyMubers = %@",person.name,person.age,person.sex,person.familyMumbers);
- NSLog(@"文件已提取");
- }
- @end
TestPerson.h
- #import
- @interface TestPerson : UIViewController
- @property (nonatomic, copy) NSString *name;
- @property (nonatomic, assign) NSInteger age;
- @property (nonatomic, copy) NSString *sex;
- @property (nonatomic, strong) NSArray *familyMumbers;
- @end
TestPerson.m
- #import "TestPerson.h"
- @interface TestPerson ()
- @end
- @implementationTestPerson
- - (void)viewDidLoad
- {
- [super viewDidLoad];
- }
- #pragma mark - NSCoding协议方法 (一定要实现)
- //当进行归档操作的时候就会调用该方法
- //在该方法中要写清楚要存储对象的哪些属性
- - (void)encodeWithCoder:(NSCoder *)aCoder
- {
- NSLog(@"调用了encodeWithCoder方法");
- [aCoder encodeObject:_name forKey:@"name"];
- [aCoder encodeInteger:_age forKey:@"age"];
- [aCoder encodeObject:_sex forKey:@"sex"];
- [aCoder encodeObject:_familyMumbers forKey:@"familyMumbers"];
- }
- //当进行解档操作的时候就会调用该方法
- //在该方法中要写清楚要提取对象的哪些属性
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- NSLog(@"调用了initWithCoder方法");
- if (self = [super init]) {
- self.name = [aDecoder decodeObjectForKey:@"name"];
- self.age = [aDecoder decodeIntegerForKey:@"age"];
- self.sex = [aDecoder decodeObjectForKey:@"sex"];
- _familyMumbers = [aDecoder decodeObjectForKey:@"familyMumbers"];
- }
- return self;
- }
- @end
点击“保存数据”后,查看沙盒中Documents目录:
点击查看文件内容:
点击“提取数据”后打印结果:
- #import "ViewController.h"
数据存储(直接写入、NSUserDefaults、NSkeyedArchiver)的更多相关文章
- iOS中的数据存储方式_Preference(NSUserDefaults)
NSUserDefaults适合存储轻量级的本地数据,项目中,我会把一些简单的数据密码.网址.登陆状态BOOL.整型/浮点型数据等和用户有关的数据用它存储.但是它不能存储自定义的对象! 实例化一个 N ...
- 数据存储简单了解(NSUserDefaults)
数据存储-使用NSUserDefaults 两个类介绍: NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefault ...
- iOS开发 - OC - 实现本地数据存储的几种方式一
iOS常用的存储方式介绍 在iOS App开发过程中经常需要操作一些需要持续性保留的数据,比如用户对于App的相关设置.需要在本地缓存的数据等等.本文针对OC中经常使用的一下存储方式做了个整理. 常用 ...
- iOS学习之应用数据存储1-属性列表、偏好设置、NSKeyedArchiver归档
iOS应用数据存储的常用方式(持久化方式) 属性列表(plist)归档(XML文件) Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3 Core ...
- IOS数据存储之NSUserDefaults
前言: 作为从事Android开发人来说一定听说过SharedPreferences,然后要成为一名ios开发工程师来说咋能不知道NSUserDefaults!接下来让我们认识一下. NSUserDe ...
- iOS开发——数据持久化&使用NSUserDefaults来进行本地数据存储
使用NSUserDefaults来进行本地数据存储 NSUserDefaults适合存储轻量级的本地客户端数据,比如记住密码功能,要保存一个系统的用户名.密码.使用NSUserDefaults是首 ...
- iOS边练边学--应用数据存储的常用方式(plist,Preference,NSKeyedArchiver)其中的三种
iOS应用数据存储的常用方式: XML属性列表(plist)归档 Preference(偏好设置) NSKeyedArchiver归档(NSCoding) SQLite3--这里暂且不讲 Core D ...
- IOS 数据存储(NSKeyedArchiver 归档篇)
什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储. 归档的作用 之前将数据存储到本地,只能是字符串.数组.字 ...
- IOS中NSUserDefaults的用法(轻量级本地数据存储)
NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名.密码之类的,个人觉得使用NSUserDefaults是首选.下次再登陆的时候就可以直接从NSUserDefa ...
随机推荐
- redis编译安装
centos7 redis-4.0.6 make 报错 jemalloc.h: No such file or directory make MALLOC=libc MALLOC默认值是jemallo ...
- linux下WIFI的AP搜索、连接方法
wpa_supplicant -Dwext -ieth1 -c/etc/wpa_supplicant.conf &wpa_cli save_configwpa_cli reconfigure ...
- 2018面向对象程序设计(Java) 第2周学习指导及要求
2018面向对象程序设计(Java) 第2周学习指导及要求(2018.9.3-2018.9.9) 学习目标 适应老师教学方式,能按照自主学习要求完成本周理论知识学习: 掌握Java Applica ...
- SAP FI模块常用事务代码
F.52 G/L: Acct Bal.Interest Calculation 总帐:计算科目余额利息 F-06 Post Incoming Payments 收款记帐 F-07 ...
- Gamma Correction
[Gamma Correction] 磁盘上存储的纹理可分为Linear Texture.Gamma Texture. sRGB sampling allows the Unity Editor to ...
- 运行VUE的前端项目
前提条件:已经安装nodejs和cnpm ,参考前一篇文章 1.在前端项目所在的目录下执行cnpm install 下载该项目需要的包,这些包和全局配置下的包可能不同的版本cnpm会根据package ...
- Mybatis学习链接
mybatis实战教程(mybatis in action),mybatis入门到精通 http://blog.csdn.net/techbirds_bao/article/details/923 ...
- PERL 正则表达式简介
来源:脚本之家 网址:http://www.jb51.net/article/17429.htm 一.简介 二.匹配操作符 三.模式中的特殊字符 1.字符+ 2.字符 []和[^] 3.字符 *和? ...
- 算法篇【递归2 -- N皇后问题】
问题:输入整数N,要求在N*N的棋盘上,互相不能攻击,不在同一行同一列上,切不在对角线上,输出全部方案. 输入: 4 输出: 2 4 1 3 3 1 4 2 思路: 假设在前k-1个摆好的 ...
- python数据分析之matplotlib学习
本文作为学习过程中对matplotlib一些常用知识点的整理,方便查找. 类MATLAB API 最简单的入门是从类 MATLAB API 开始,它被设计成兼容 MATLAB 绘图函数. from p ...