数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager

Documents:保存应用运行时生成的需要持久化的数据。例如,游戏应用可将游戏存档保存在该目录。iTunes同步设备时会备份该目录
Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
Library/Caches:保存应用运行时生成的需要持久化的数据,一般存储体积大、不需要备份的非重要数据,iTunes同步设备时不会备份该目录。
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
4.获取目录路径代码:
//获取沙盒路径
NSString *home = NSHomeDirectory(); //1.获取Document路径
//1.1通过文件名获取,因为ios以后的新版本可能修改目录名,不建议使用
NSString *documentPath1 = [home stringByAppendingPathComponent:@"Documents"];
//1.2通过系统方法获取,建议使用
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentPath2 = [array objectAtIndex:]; //2.获取Library/Cache目录,获取方式同Document,下面是系统方法
NSArray *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachePath = [cache objectAtIndex:]; //3.获取Library/Preferences也可食用1.1的方式获取,但因为是保存setting设置,一般通过NSUserDefaults直接存储
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:@"myname" forKey:@"username"]; //4.获取tmp目录
NSString *tmpPath = NSTemporaryDirectory();
如何在沙盒中操作文件夹和文件,系统提供了
二.文件存储
1.XML属性列表(plist归档)
dataWithContentsOfFile方法读取plist文件中的信息并实例化对象
NSString *tmpPath = NSTemporaryDirectory();
NSString *path = [tmpPath stringByAppendingPathComponent:@"test.plist"]; // 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"jason" forKey:@"name"];
[dict writeToFile:path atomically:YES]; // 读取plist的内容,实例化NSDictionary
NSDictionary *dictPlist = [NSDictionary dictionaryWithContentsOfFile:path];
NSLog(@"name:%@", [dictPlist objectForKey:@"name"]);
2.NSUserDefaults(偏好设置)
使用set方法保存不同类型的对象,使用xxxForKey方法获取值
//偏好设置
NSUserDefaults *dft = [NSUserDefaults standardUserDefaults];
[dft setObject:@"jason" forKey:@"username"];
[dft setFloat:1.77f forKey:@"high"];
[dft setBool:YES forKey:@"auto_logon"]; //读取偏好设置
NSUserDefaults *dft2 = [NSUserDefaults standardUserDefaults];
NSString *name = [dft2 objectForKey:@"username"];
float h = [dft2 floatForKey:@"high"];
BOOL al = [dft2 boolForKey:@"auto_logon"];
NSLog(@"%@--%f--%hhd",name,h,al);
自动在Library/Preferences/生成项目名开头的plist文件

3.NSKeyedArchiver 归档(加密形式)
机制类似于java的对象序列化,归档是指将对象保存到文件,反归档(读档)是指将文件内容解析成对象
3.1 NSString、NSDictionary、NSArray、NSData、NSNumber等类型,可以直接用NSKeyedArchiver进行归档和反归档
3.2 任何遵守了NSCoding协议的对象,都可以进行归档和反归档
3.3 NSCoding协议需要实现两个方法:
- (void)encodeWithCoder:(NSCoder *)encoder //将对象归档的时候会调用(将对象写入文件之前会调用),用来说明哪些属性需要归档,怎样归档
-(id)initWithCoder:(NSCoder *)decoder //当从文件中反归档对象时调用,用来说明哪些属性需要反归档,怎样反归档
注:如果父类中也有属性需要归档或者反归档,必须调用super的encodeWithCoder:和initWithCoder:方法
3.4代码实例:
3.4.1 对象类:Person和子类Man
// Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject<NSCoding>
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) int age;
@property (nonatomic, assign) double height;
@end // Person.m #import "Person.h" @implementation Person //归档时调用
- (void)encodeWithCoder:(NSCoder *)coder
{
[coder encodeObject:_name forKey:@"name"];
[coder encodeInt:_age forKey:@"age"];
[coder encodeDouble:_height forKey:@"height"];
} //反归档时调用调用的初始化方法
-(id)initWithCoder:(NSCoder *)deCode
{
if (self = [super init]) {
_name = [deCode decodeObjectForKey:@"name"];
_age = [deCode decodeIntForKey:@"age"];
_height = [deCode decodeDoubleForKey:@"height"];
}
return self;
} @end // Man.h继承自Person
#import "Person.h" @interface Man : Person
@property (nonatomic, copy) NSString *sex;
@end // Man.m
#import "Man.h" @implementation Man //归档时调用
-(void)encodeWithCoder:(NSCoder *)coder
{
//首先调用父类的归档方法
[super encodeWithCoder:coder];
[coder encodeObject:_sex forKey:@"sex"];
} //反归档时调用的初始化方法
-(id)initWithCoder:(NSCoder *)deCode
{
if (self = [super initWithCoder:deCode]) {
_sex = [deCode decodeObjectForKey:@"sex"];
}
return self;
} @end
3.4.1 归档和反归档的实现方法
NSString *tmpPath = NSTemporaryDirectory();
NSString *path1 = [tmpPath stringByAppendingPathComponent:@"person.data"];
NSString *path2 = [tmpPath stringByAppendingPathComponent:@"man.data"]; Person *p = [[Person alloc]init];
p.name = @"a";
p.age = ;
p.height = 1.70f; Man *m = [[Man alloc]init];
m.name = @"b";
m.age = ;
m.height = 1.77f;
m.sex = @"male"; //归档
[NSKeyedArchiver archiveRootObject:p toFile:path1];
[NSKeyedArchiver archiveRootObject:m toFile:path2]; //反归档
Person *p2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path1];
Man *m2 = [NSKeyedUnarchiver unarchiveObjectWithFile:path2];
NSLog(@"%@--%d--%f",p2.name,p2.age,p2.height);
NSLog(@"%@--%d--%f---%@",m2.name,m2.age,m2.height,m2.sex);
4.SQLite3 & Core Data
都是对数据做操作,CoreData只是在SQLite3的基础上做了一层面向对象的封装,类似于Hibernate,暂不总结,后续会新写文章总结
三.NSFileManager
参考文章:http://www.cnblogs.com/xyzlmn/p/3196930.html
创建文件夹:
//创建文件夹
-(void *)createDir{
NSString *documentsPath =[self dirDoc];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
// 创建目录
BOOL res=[fileManager createDirectoryAtPath:testDirectory withIntermediateDirectories:YES attributes:nil error:nil];
if (res) {
NSLog(@"文件夹创建成功");
}else
NSLog(@"文件夹创建失败");
}
创建文件
//创建文件
-(void *)createFile{
NSString *documentsPath =[self dirDoc];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
BOOL res=[fileManager createFileAtPath:testPath contents:nil attributes:nil];
if (res) {
NSLog(@"文件创建成功: %@" ,testPath);
}else
NSLog(@"文件创建失败");
}
写数据到文件:
//写文件
-(void)writeFile{
NSString *documentsPath =[self dirDoc];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
NSString *content=@"测试写入内容!";
BOOL res=[content writeToFile:testPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
if (res) {
NSLog(@"文件写入成功");
}else
NSLog(@"文件写入失败");
}
读文件数据:
//读文件
-(void)readFile{
NSString *documentsPath =[self dirDoc];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
// NSData *data = [NSData dataWithContentsOfFile:testPath];
// NSLog(@"文件读取成功: %@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
NSString *content=[NSString stringWithContentsOfFile:testPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"文件读取成功: %@",content);
}
文件属性:
//文件属性
-(void)fileAttriutes{
NSString *documentsPath =[self dirDoc];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
NSDictionary *fileAttributes = [fileManager attributesOfItemAtPath:testPath error:nil];
NSArray *keys;
id key, value;
keys = [fileAttributes allKeys];
int count = [keys count];
for (int i = 0; i < count; i++)
{
key = [keys objectAtIndex: i];
value = [fileAttributes objectForKey: key];
NSLog (@"Key: %@ for value: %@", key, value);
}
}
删除文件:
//删除文件
-(void)deleteFile{
NSString *documentsPath =[self dirDoc];
NSString *testDirectory = [documentsPath stringByAppendingPathComponent:@"test"];
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *testPath = [testDirectory stringByAppendingPathComponent:@"test.txt"];
BOOL res=[fileManager removeItemAtPath:testPath error:nil];
if (res) {
NSLog(@"文件删除成功");
}else
NSLog(@"文件删除失败");
NSLog(@"文件是否存在: %@",[fileManager isExecutableFileAtPath:testPath]?@"YES":@"NO");
}
遍历子文件夹:
NSString *home = NSHomeDirectory();
NSFileManager *fileManage = [NSFileManagerdefaultManager];
NSArray *file = [fileManage subpathsOfDirectoryAtPath: home error:nil];
NSLog(@"%@",file);
NSArray *files = [fileManage subpathsAtPath: home ];
NSLog(@"%@",files);
数据持久化-存取方式总结&应用沙盒&文件管理NSFileManager的更多相关文章
- iOS路径沙盒文件管理(转载)
iOS路径沙盒文件管理,看到博主总结的很好,转载过来,原文:http://www.aichengxu.com/view/35264 一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文 ...
- NSFileManager(沙盒文件管理)数据持久化 <序列化与反序列化>
iOS应用程序只能在为该改程序创建的文件中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等. 默认情况下 ...
- NSFileManager 沙盒文件管理
文件夹创建,复制,移动,删除,检查是否存在,代码如下: 1.获取沙盒 document 路径,作为文件夹路径的基路径. NSString *document = NSSearchPathForDire ...
- 1211笔记关于//modal//更改窗口的根控制器//数据存取//Plist属性列表//-“沙盒机制”//plis属性列表//偏好设置//归档普通对象//联系人数据存储//协议与回调函数
一.利用Modal形式展示控制器 1.如何展示// vc就是要展示的新控制器[self presentViewController:vc animated:YES completion:^{ N ...
- iOS数据持久化-OC
沙盒详解 1.IOS沙盒机制 IOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文 ...
- iOS 阶段学习第25天笔记(iOS沙盒机制介绍)
iOS学习(OC语言)知识点整理 一.iOS沙盒机制介绍 1)概念: 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用放入文件 系统隔离,ios系统不允许访问 其他应用的应用沙盒 ...
- 沙盒SandBox
每个App都有自己的沙盒,也就是一个存储空间.App之间没有权限访问对方的沙盒资源.沙盒的目录下有三个文件夹:Documents.Library.temp 目录结构 Documents:用于存储用户数 ...
- iOS8沙盒路径的变化
iOS8中的的沙盒路径发生了变化 之前是这样的路径,通过NSHomedictionary()获取的家路径 /Users/wupeng/Library/Application Support/iPhon ...
- iOS开发——数据持久化Swift篇&(二)沙盒文件
沙盒文件 //******************** 5.2 文件操作 func use_FileOperations() { //1.获取程序的Home目录 let homeDirectory = ...
随机推荐
- android自己定义圆盘时钟
自己定义圆盘时钟的大概流程:由于圆盘时钟的圆盘是不须要动的,所以不必要加在自己定义的view里面,在view里面仅仅须要绘制秒针和分针时针并控其转动就可以. 下面就是自己定义view的主要代码: pa ...
- Hadoop2.6.0配置參数查看小工具
前言 使用Hadoop进行离线分析或者数据挖掘的project师,常常会须要对Hadoop集群或者mapreduce作业进行性能调优. 或许你知道通过浏览器訪问http://master:18088/ ...
- MySQ学习笔记之十 NULL值处理
这是MySQL一大特殊之处. 概念上.NULL意味着"没有值"或"未知值",且它被看作有点与众不同的值. 为了測试NULL.你不能使用算术比較运算符比如=.&l ...
- [poj 2912] Rochambeau 解题报告 (带权并查集)
题目链接:http://poj.org/problem?id=2912 题目: 题目大意: n个人进行m轮剪刀石头布游戏(0<n<=500,0<=m<=2000) 接下来m行形 ...
- Leaflet学习笔记(一)
一.简介 Leaflet是一个主要适用于移动端交互地图的领先的开源javascript库.虽然js库只有38KB左右,但是却能满足大部分开发者的所有功能需求. Leaflet拥有着简单,高效和实用的设 ...
- Windows10显示桌面我的电脑等图标
1.桌面右键,选择最后一项:个性化 2. 选择:主题 --> 桌面图标设置 3. 将需要显示的图标勾上就可以啦.
- WLAN 感知
WLAN 感知 通过 Android 8.0 中新增的 WLAN 感知功能,支持设备可以直接使用 WLAN 感知协议发现其他设备.与其他设备进行互连,以及将覆盖范围扩展到其他设备(Android 9 ...
- 前端之HTTP协议
HTTP协议简介 作为学习前端开发的开始,我们必须搞明白以下几件事 1.什么是互联网 互联网=物理连接介质+互联网协议 2.互联网建立的目的? 数据传输打破地域限制,否则的话,我想获 ...
- LNMP安装部署开源IP管理工具phpipam
1.数据库 mariadb 安装 //依赖安装 yum install -y apr* autoconf automake bison bzip2 bzip2* compat* \ cpp curl ...
- mySQL主从复制实战
随着访问量的不断增加,单台MySQL数据库服务器压力不断增加,需要对MYSQL进行优化和架构改造,MYQSL优化如果不能明显改善压力情况,可以使用高可用.主从复制.读写分离来.拆分库.拆分表来进行优化 ...