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可以存取多种介质类型数据, ...
随机推荐
- 内存空间申请(C)
标准C,C++: malloc----free new----delete WINDOWS API: gnew(.net) LocalAlloc----LocalFree GlobalAlloc--- ...
- libevent在windows下用visual studio编译时出现error C2894错误的原因与解决方法
libevent是一个使用很广泛的网络库,今天想了解下它.于是去git clone了一份源码,用vs2005的命令行:nmake -f makefile.nmake编译之,顺利编译通过,生成三个静态库 ...
- 关于 js 动态生成html 绑定事件失效的问题
在实际问题中,也只到使用新版jq 的on 事件 进行动态元素的绑定: 是这样 (但是依然没有效果——): $('dom节点').on('click',function(){}) 之后经过查阅发现:正确 ...
- IOS开发UI篇之──自定义加载等待框(MBProgressHUD)
本文转载至 http://blog.csdn.net/xunyn/article/details/8064984 原文地址http://www.189works.com/article-89289 ...
- 博文分类索引--Python
Python 基础 [python]-- 初识python [python]-- 基本语法.循环 [python]-- 列表 [python]-- 元组.字典 [python]-- 字符串.字符编码与 ...
- delphi下webbrowser的应用
查找操作tagName为input的对象var i:Integer; myole:oleVariant; begin myole := wb1.Document; for i := 0 to myol ...
- 查找杀死指定进程delphi
//需要引用tlhelp32单元//查找进程function findProcessId(pname:string):Cardinal; var hsnapshot:THandle; lpe:TPro ...
- QBuffer简单操作(被看做一个标准的可随机访问的文件,支持信号)
Qt中通过QBuffer类我们可以使用io的方式访问.操作QByteArray中的内容.此时,QByteArray被看做一个标准的可随机访问的文件.例如: QBuffer buffer; char c ...
- [转】[tip] localhost vs. (local) in SQL Server connection strings
主要区别在于连接协议不同,前者(localhost)使用TCP协议,后者("(local)")使用NamedPipe协议. Sample code with SQL Server ...
- 江卓尔与比特币增发,谣言or先知-千氪
最近,很多圈内人都在讨论比特币是否应该增发,但等等,比特币真的会增发吗?到底是真有增发计划还是某些人别有用心地在散布谣言? 那么消息是从哪里出来的?北京时间 2 月 10 日晚,莱比特矿池创始人江卓尔 ...