数据存储(直接写入、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);
}
@endInterface Building中设置了两个按钮:

点击“保存数据”后,查看沙盒中的Libarary/ Preferences目录:

数据以plist的格式写入磁盘中了。点开查看数据:

三、NSKeyedArchiver(归档操作)
使用归档操作存储数据的主要好处是,不同于前面两种方法只能存储几个常用的数据类型的数据,NSKeyedArchiver可以存储自定义的对象。
代码示例:
需要注意的是,需要保存的对象类一定要引用NSCoding协议,并且实现
- (void)encodeWithCoder:(NSCoder *)aCoder
- (id)initWithCoder:(NSCoder *)aDecoder1、文件结构:

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(@"文件已提取");
}
@endTestPerson.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;
@endTestPerson.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目录:

点击查看文件内容:

点击“提取数据”后打印结果:

数据存储(直接写入、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 ...
随机推荐
- C++读取txt和保存到txt
哇,今天又重新用C++来写了一些代码发现自己竟然在类的使用和文件读取和保存上面特别头疼,于是,各种问度娘+各种翻看之前的代码.不禁感叹,自己的代码还是写的太少了,对这些一点都不熟悉.于是,今晚!一定! ...
- zxing全屏识别(v2.5.0崩溃问题记录)
自己遇到的问题:/** * Like {@link #getFramingRect} but coordinates are in terms of the preview frame, * not ...
- Webpack Loaders
[Webpack Loaders] 1.Query parameters Loader can be passed query parameters via a query string (just ...
- Cacti日志时区问题
cacti默认是以美国的时间为准的,监测的适合要纠正到UTC+8的时区. 打开vi /home/cacti/include/config.php 文件,在里面加入一行 date_default_tim ...
- spark基本组件与概念
数据结构 核心之数据集RDD 俗称为弹性分布式数据集.Resilient Distributed Datasets,意为容错的.并行的数据结构,可以让用户显式地将数据存储到磁盘和内存中,并能控制数据的 ...
- I/O复用之select
作用: 实现I/O的多路复用 该函数允许进程指示内核等待多个事件中的任何一个发生,并只有在一个或多个事件发生时或经历一段指定的时间后才唤醒它.进程将于select处阻塞,直到被检测的描述符有一个或多个 ...
- xnconvert 图片转换工具
xnconvert是一款简单高效的图片转换工具.xnconvert能够批量地进行图片格式转换,并具有一定的图片处理功能,可以增加水印.特效,支持放大缩小.旋转等. xnconvert功能介绍: 你可以 ...
- 8 种 NoSQL 数据库系统对比(转自: http://blog.jobbole.com/1344/)
导读:Kristóf Kovács 是一位软件架构师和咨询顾问,他最近发布了一片对比各种类型NoSQL数据库的文章. 虽然SQL数据库是非常有用的工具,但经历了15年的一支独秀之后垄断即将被打破.这只 ...
- jsp页面之初体验
最近在学jsp 在web.xml页面中学到了如何让一个页面第一个启动
- TOJ1302: 简单计算器 && TOJ 4873: 表达式求值&&TOJ3231: 表达式求值
这些都是应用Python的eval函数的一些题目! TOJ1302传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=show ...