iOS_数据存取(一)
目录:
一、沙盒机制
二、用户偏好设置
三、归档
一、沙盒机制
iOS应用沙盒结构分析
//获取home目录
NSString *homePath = NSHomeDirectory();
NSLog(@"home%@",homePath); //获取documents目录
//方式1:
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [documents lastObject];
NSLog(@"%@",documentsPath);
//方式2:拼接字符串
NSString *documentPath2 = [homePath stringByAppendingPathComponent:@"Documents"];
NSLog(@"documenPath2:%@",documentPath2); //获取caches缓存目录
NSArray *caches = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesPath = [caches lastObject];
NSLog(@"cachesPath:%@",cachesPath); //获取临时目录
NSString *tmp = NSTemporaryDirectory();
NSLog(@"tmp:%@",tmp); //在documents目录下创建文件
NSFileManager *fm = [NSFileManager defaultManager];
NSString *fileName = [documentsPath stringByAppendingPathComponent:@"1.txt"];
NSString *str = @"hello world";
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; if ([fm createFileAtPath:fileName contents:data attributes:nil]) {
NSLog(@"file create successful");
} //读出文件的内容
NSError *error = nil; NSString *str2 = [NSString stringWithContentsOfFile:fileName encoding:NSUTF8StringEncoding error:&error];
if (!error) {
NSLog(@"str2:%@",str2);
}
else
{
NSLog(@"%@",error);
}
//NSBundle对象:图片、xib、storyBoard、plist文件都是放在应用程序包中
NSBundle *bundle = [NSBundle mainBundle];
//获取包中文件的路径;
NSString *path = [bundle pathForResource:@"array" ofType:@"plist"];
//加载包中的xib文件
NSArray *views = [bundle loadNibNamed:@"cell" owner:self options:nil];
二、Preference(用户偏好设置)
很多iOS应⽤用都⽀持偏好设置,⽐如保存⽤户名、密码、字体⼤小等设置, iOS提供了⼀套标准的解决⽅案来为应用加⼊偏好设置功能
每个应⽤都有个NSUserDefaults实例,通过它来存取偏好设置。
1)偏好设置是专门用来保存应用程序的配置信息的, 一般情况不要在偏好设置中保存其他数据。如果利用系统的偏好设置来存储数据, 默认就是存储在Preferences文件夹下面的,偏好设置会将所有的数据都保存到同一个文件中。
2)使用偏好设置对数据进行保存之后, 它保存到系统的时间是不确定的,会在将来某一时间点自动将数据保存到Preferences文件夹下面,如果需要即刻将数据存储,可以使用[defaults synchronize];
3)注意点:所有的信息都写在一个文件中,对比简单的plist可以保存和读取基本的数据类型。
4)步骤:获取NSuserDefaults,保存(读取)数据
代码参考如下:
创建用户偏好设置,保存信息
#import "AppDelegate.h"
......
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//创建用户偏好设置对象
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:@"admin" forKey:@"userName"];
[userDefaults setObject:@"" forKey:@"userPassword"];
[userDefaults setInteger: forKey:@"loginTime"];
[userDefaults setObject: [NSDate date] forKey:@"loginDate"];
//同步保存
[userDefaults synchronize]; NSLog(@"%@",NSHomeDirectory());
return YES;
}
...... //创建偏好设置,读取信息(注意:NSUserDefaults是单例对象)
#import "ViewController.h"
......
- (void)viewDidLoad {
[super viewDidLoad];
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSString *userName = [userDefault objectForKey:@"userName"];
NSString *userPassword = [userDefault objectForKey:@"userPassword"];
NSInteger loginTime = [userDefault integerForKey:@"loginTime"];
NSDate *loginDate = [userDefault objectForKey:@"loginDate"];
NSDateFormatter *df = [[NSDateFormatter alloc]init];
NSString *Date = [df stringFromDate:loginDate]; NSLog(@"%@,%@,%ld,%@",userName,userPassword,loginTime,loginDate);
}
......
注意:UserDefaults设置数据时,不是立即写入,而是根据时间戳定时地把缓存中的数据写⼊本地磁盘。所以调⽤了set方法之后数据有可能还没有写入磁盘应用程序就终止了。出现以上问题,可以通过调⽤synchornize方法强制写入。
三、NSKeyedArchiver(归档)
1.如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接⽤用NSKeyedArchiver进⾏行归档和恢复
//创建需要归档的对象数据
NSArray *array = @[@,@,@,@];
//创建拼接路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//执行归档操作
if ([NSKeyedArchiver archiveRootObject:array toFile:archiverPath])
{
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
//打印Home目录
NSLog(@"%@",NSHomeDirectory());
//解归档操作
NSArray *array2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiverPath];
NSLog(@"%@",array2);
2.不是所有的对象都可以直接用这种方法进行归档,只有遵守了NSCoding协议的对象才可以,NSCoding协议有2个⽅方法: 实例变量,可以使用encodeObject:forKey:⽅法归档实例变量
ViewController.m文件代码如下:
#import "ViewController.h"
#import "Person.h"
......
[super viewDidLoad];
Person *person = [[Person alloc]init];
person.name = @"zhangsan";
person.age = ;
person.gender = 'F'; //拼接保存路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//执行归档操作
if ([NSKeyedArchiver archiveRootObject:person toFile:archiverPath]) {
NSLog(@"归档成功");
}
else
{
NSLog(@"归档失败");
}
NSLog(@"%@",NSHomeDirectory());
//解归档,创建新的对象
Person *person2 = [NSKeyedUnarchiver unarchiveObjectWithFile:archiverPath];
NSLog(@"%@",person2); .....
Person.m代码如下:
#import "Person.h" @implementation Person
-(instancetype)initWithName:(NSString *)name andAge:(NSInteger)age andGender:(char)gender
{
if (self = [super init]) {
_name = [name copy];
_age = age;
_gender = gender;
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"name:%@,age:%ld,gender:%c",_name,_age,_gender];
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeInteger:self.age forKey:@"age"];
[aCoder encodeInteger:self.gender forKey:@"gender"];
}
-(id)initWithCoder:(NSCoder *)aDecoder
{
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
self.gender = [aDecoder decodeIntegerForKey:@"gender"];
return self;
}
@end
NSKeyedArchiver-归档对象的注意如果⽗类也遵守了NSCoding协议,请注意:
应该在encodeWithCoder:⽅法中加上⼀一句 [super encodeWithCode:encode];
确保继承的实例变量也能被编码,即也能被归档
应该在initWithCoder:⽅法中加上⼀一句self = [super initWithCoder:decoder];
确保继承的实例变量也能被解码,即也能被恢复
3.NSData进行多个对象归档
NSString *userName = @"zhangsan";
NSInteger age = ;
NSString *address = @"北京尚学堂";
//创建一个可变数据区,用于保存对象
NSMutableData *data = [[NSMutableData alloc]init]; //拼接路径
NSArray *documents = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *path = [documents lastObject];
NSString *archiverPath = [path stringByAppendingPathComponent:@"archiver.arc"];
//创建归档对象,将要归档的对象加入data可变数据区中
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:data];
//归档操作
[archiver encodeObject:userName forKey:@"name"];
[archiver encodeInteger:age forKey:@"age"];
[archiver encodeObject:address forKey:@"address"];
//结束归档
[archiver finishEncoding];
//将data的数据写入到文件中,保存起来。
[data writeToFile:archiverPath atomically:YES]; //创建新的可变数据区
NSMutableData *data2 = [NSMutableData dataWithContentsOfFile:archiverPath];
//解归档操作
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data2];
NSString *name = [unarchiver decodeObjectForKey:@"name" ];
NSInteger age2 = [unarchiver decodeIntegerForKey:@"age"];
NSString *address2 = [unarchiver decodeObjectForKey:@"address"];
NSLog(@"name:%@,age:%ld,address:%@",name,age2,address2);
iOS_数据存取(一)的更多相关文章
- iOS_数据存取(二)
本节内容目录: 一.SQLite3 二.Core Data 一.SQlite3 SQLite3是⼀款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销小SQLite3是⽆类型的,意味着你可以保存任 ...
- JavaScript数据存取的性能问题
JavaScript中四种基本的数据存取位置: 字面量:只代表自身 字符串.数字.布尔值.对象.函数.数组.正则,以及null和undefined 快 本地变量:var定义的 快 数组元素 ...
- Hyperledger中数据存取的实现
简介 本文介绍了在Hyperledger中数据存取的实现. API接口 Hyperledger提供基于key/value的数据存储,其中key是字符串,value则是二进制字节数组,Hyperledg ...
- 高性能JS笔记2——数据存取
数据存取性能而言: 字面量>本地变量>数组元素>对象成员 一.标识符解析的性能 标识符解析是有代价的,一个标识符的位置越深,它的读写速度也就越慢. 局部变量的读写速度是最快的,全局变 ...
- Laxcus大数据管理系统2.0(5)- 第三章 数据存取
第三章 数据存取 当前的很多大数据处理工作,一次计算产生几十个GB.或者几十个TB的数据已是正常现象,驱动数百.数千.甚至上万个计算机节点并行运行也已经不足为奇.但是在数据处理的后面,对于这种在网络间 ...
- 使用文本文件(.txt)进行数据存取的技巧总结(相当的经典)
使用文本文件(.txt)进行数据存取的技巧总结(相当的经典) 使用文本文件(.txt)进行数据存取的技巧总结 由于本帖内容较多,部分转自他人的心得,因此,凡转贴的地方仅用“----转----”标注,原 ...
- 数据分析与展示——NumPy数据存取与函数
NumPy库入门 NumPy数据存取和函数 数据的CSV文件存取 CSV文件 CSV(Comma-Separated Value,逗号分隔值)是一种常见的文件格式,用来存储批量数据. np.savet ...
- go 多维度 Map 的数据存取
多维度 Map 的数据存取 一维情况下的 map 做存取很简单,而二维以上的情况就得小心了. 先来看一个例子: m:=make(map[string]map[string]int) c:=make ...
- Pandas数据存取
pd.read_excel('foo.xlsx', 'Sheet1', index_col=None, na_values=['NA']) Pandas数据存取 Pandas可以存取多种介质类型数据, ...
随机推荐
- hadoop之WordCount源代码分析
//近期在研究hadoop.第一个想要要開始研究的必然是wordcount程序了.看了<hadoop应用开发实战解说>结合自己的理解,对wordcount的源代码进行分析. <pre ...
- IDEA15入门常用设置
打开IDEA设置的快捷键:Ctrl + Alt + S 打开选中的项目属性快捷键:Shift + Ctrl + Alt + S 1.IDEA默认不会使用我们独立安装的Maven配置,需要手动设置,并且 ...
- SlidingMenu——使用前的配置
一: 首先下载lib:SlidingMenu.然后将起导入eclipse中,然后将其clean一下,重新生成R文件. 二: 因为SlidingMenu依赖ActionBarSherlock,所以需要下 ...
- Django项目笔记:sessions处理以及复杂对象序列化
前言:一点题外话 我发现,不更新博客的时候,不是非常忙,就是效率非常低.最近没怎么更新博客,原因是第二种= =.惭愧惭愧. 今天效率出奇的高,一天时间把PassNote后端的接口全部写完了,Djang ...
- Python数据驱动ddt
import ddtimport unittest """ddt模块包含了一个类的装饰器ddt和两个方法的装饰器: data:包含多个你想要传给测试用例的参数: file ...
- Java格式化日期的三种方式
1)借助DateFormat类: public String toString(Date d) { SimpleDateFormat sdf = new SimpleDateFormat(“yyyy- ...
- 每个分片都是一个独立的Apache Lucene索引
数据架构:索引+文档+文档类型+映射 [索引 文档 文档类型 映射] 索引index 对逻辑数据的逻辑存储:关系型数据库表.MongoDB集合.CouchDb数据库索引 index <---sh ...
- Webstorm如何设置背景色为护眼色(豆绿色)
本文主要讲webstorm如何设置背景色. 1.打开idea Settings 选择 Editor——Color Scheme——General 注意:如果是Mac,在webstorm界面按键:“co ...
- MFC重绘原理的关键理解
// ====================Windows重绘消息与函数========================== 得到桌面窗口的句柄,然后再绘图HWND GetDesktopWindow ...
- 兼容ie的background-size: cover;
.bg{ background: url() no-repeat; background-size:cover; filter: progid:DXImageTransform.Microsoft.A ...