数据持久化以及沙盒路径

什么是沙盒机制

简单对象写入文件

NSFileManager

复杂对象写入文件

数据持久化

什么是数据持久化?

数据的永久存储

为什么要做数据持久化?:存储在内存中的数据,程序关闭,内存释放,数据丢失,这种数据是临时的,用户下次打开应用程序,还要重新联网去刷新数据,无疑增加了用户的负担

数据持久化的本质:数据保存成文件,存储到程序的沙盒中

什么是沙盒机制?

每个应用程序位于文件系统的严格限制部分

每个应用程序只能在为该程序创建的文件系统中读取文件

每个应用程序在iOS系统内部都放在了统一的文件夹目录下面

沙盒的本质就是一个文件夹,名字是随机分配的

沙盒路径的位置

1.通过Finder查找程序的沙盒相对路径

~/Library/Application Support/iPhone Simulator

常见问题

模拟器路径内有可能包含多个系统版本的路径

沙盒机制

通过代码查找程序沙盒相对路径

NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask domainMask, BOOL expandTilde)

获取沙盒目录路径的方法

NSHomeDirectory----------------------->沙盒主路径

NSDocumentDirectory------------------>Documents文件夹

NSLibraryDirectory---------------------->Library文件夹

NSCachesDirectory---------------------->Caches文件夹

NSTemporaryDirectory()---------------->tmp文件夹

NSBundle

每个应用程序文件夹内的app文件是什么?

每个应用程序文件夹内的app文件路径如何获取?

获取应用程序app文件夹内的文件路径

获取应用程序的相关配置属性

二、简单对象写入文件

// 字符串对象写入文件

// 获取沙盒目录

NSString *documentsPath =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).lastObject;

NSLog(@"%@", documentsPath);

// 方法二

NSString *homePath = NSHomeDirectory();

// homePath = [homePath stringByAppendingString:@"/Documents"];

homePath = [homePathstringByAppendingPathComponent:@"Documents"];

NSLog(@"%@", homePath);

// 2.拼接文件路径

NSString *filePath = [documentsPathstringByAppendingPathComponent:@"abc.txt"];

NSLog(@"%@", filePath);

NSString *str = @"情人节了,赛赛你还是一个人吗?";

// 将str中的字符串写入文件

[str writeToFile:filePath atomically:YES encoding:NSUTF8StringEncodingerror:nil];

// 上面三行已经实现了把数据存入abc.txt文件夹下,实现数据持久化

NSString *str2 = [NSString stringWithContentsOfFile:filePathencoding:NSUTF8StringEncoding error:nil];

NSLog(@"%@", str2);

// 数组对象写入文件

// 在文件夹后面拼接数组txt文件,实现数组的添加

NSString *arrayFilePath = [documentsPathstringByAppendingPathComponent:@"array.txt"];

NSArray *array = @[@"大赛赛", @"大鼠标", @"小超超", @"小彪彪", @"大黄黄",@"大波波"];

[array writeToFile:arrayFilePath atomically:YES];

NSArray *array2 = [NSArray arrayWithContentsOfFile:arrayFilePath];

NSLog(@"%@", array2);

// 字典对象写入文件

// 在文件夹后面拼接字典txt文件,实现字典的添加

NSString *dictionaryFilePath = [documentsPathstringByAppendingPathComponent:@"dictionary.txt"];

NSDictionary *dictionary = @{@"saisai": @"赛赛",

@"chaochao":@"超超",

@"doudou":@"豆豆"};

[dictionary writeToFile:dictionaryFilePath atomically:YES];

NSDictionary *dictionary2 = [NSDictionarydictionaryWithContentsOfFile:dictionaryFilePath];

NSLog(@"%@", dictionary2);

// 图片对象写入文件

// 将图片资源转为NSData类型,再储存

UIImage *image = [UIImage imageNamed:@"1.png"];

// 将图片转化为NSData

NSData *imageData = UIImagePNGRepresentation(image);

// 拼接data数据路径

NSString *dataFilePath = [documentsPathstringByAppendingPathComponent:@"image.txt"];

// 将data数据写入文件中

[imageData writeToFile:dataFilePath atomically:YES];

三、NSFileManager

NSFileManager, 文件管理,使用detaultManager, 创建单例对象。

可以创建文件夹

可以创建、移动、复制、删除文件

可以判断文件是否存在

//NSFileManager

NSString *path1 = [documentsPathstringByAppendingPathComponent:@"path1/path2/path3"];

NSLog(@"%@", path1);

// 创建文件夹

[[NSFileManager defaultManager] createDirectoryAtPath:path1withIntermediateDirectories:YES attributes:nil error:nil];

// 判断文件是否存在

BOOL b = [[NSFileManager defaultManager]fileExistsAtPath:dictionaryFilePath];

NSLog(@"%d", b);

四、复杂对象写入文件

#import

// 首先创建一个Person类,遵守NSCoding协议,在.m文件中实现编码和反编码的方法

@interface Person : NSObject<</span>NSCoding>

@property (nonatomic, copy) NSString *name;

@property (nonatomic, copy) NSString *gender;

@property (nonatomic, assign) NSInteger age;

@end

.m文件

#import "Person.h"

#define kName @"name"

#define kGender @"gender"

#define kAge @"age"

@implementation Person

#pragma mark 进行编码

- (void)encodeWithCoder:(NSCoder *)aCoder

{

[aCoder encodeObject:self.name forKey:kName];

[aCoder encodeObject:self.gender forKey:kGender];

// 几个属性就要写几行,对于NSInteger类型的有专用的方法

[aCoder encodeInteger:self.age forKey:kAge];

}

#pragma mark 反编码

- (id)initWithCoder:(NSCoder *)aDecoder

{

self = [super init];

if (self) {

self.name = [aDecoder decodeObjectForKey:kName];

self.gender = [aDecoder decodeObjectForKey:kGender];

self.age = [aDecoder decodeIntegerForKey:kAge];

}

return self;

}

#pragma mark dealloc

- (void)dealloc

{

[_name release], _name = nil ;// 安全释放

[_gender release], _gender = nil; // 安全释放

[super dealloc];

}

@end

在主控制器中引入Person类对象

#import "JYFViewController.h"

#import "Person.h"

下面即是方法

// 创建Person对象

Person *person = [[Person alloc] init];

person.name = @"彪彪";

person.gender = @"男";

person.age = 22;

// 创建可变的NSMutableData准备存放person对象

NSMutableData *personData = [NSMutableData data];

// 创建归档工具

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]initForWritingWithMutableData:personData];

// 进行二进制的转换

[archiver encodeObject:person forKey:@"personKey"];

// 完成转换

[archiver finishEncoding];

// 创建路径

NSString *personFilePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).lastObjectstringByAppendingPathComponent:@"person.abc"];

// 进行NSData对象的写入

//[personData writeToFile:personFilePath atomically:YES];

// 反归档

// 1.创建一个data用来接受person文件路径中的数据

NSData *data = [NSData dataWithContentsOfFile:personFilePath];

// 2.使用data去创建反归档工具

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]initForReadingWithData:data];

// 3.使用工具把二进制数据转回复杂对象

Person *p = [unarchiver decodeObjectForKey:@"personKey"];

// 4.结束反归档

[unarchiver finishDecoding];

// 简便方法

// 创建路径

NSString *chaochoaFilePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES).lastObjectstringByAppendingPathComponent:@"chaochao.avi"];

NSLog(@"%@", chaochoaFilePath);

// 创建对象

Person *chaochao = [[Person alloc] init];

chaochao.name = @"超超";

chaochao.gender = @"男";

chaochao.age = 23;

// 进行数据保存

[NSKeyedArchiver archiveRootObject:chaochao toFile:chaochoaFilePath];

// 读取

Person *chaochaoPerson = [NSKeyedUnarchiverunarchiveObjectWithFile:chaochoaFilePath];

NSLog(@"%@ %@ %d", chaochaoPerson.name, chaochaoPerson.gender, chaochao.age);

总结:

沙盒机制

简单对象写入文件,只能是NSString、NSArray、NSDictionary、NSData

复杂对象写入文件,遵守NSCoding协议,实现代理方法

时间: 2024-10-07 05:29:49

数据持久化以及沙盒路径的相关文章

沙盒路径

//主目录,方法一 NSString *path = NSHomeDirectory(); NSLog(@"NSHomeDirectory:%@",path); //主目录,方法二 NSString *userName = NSUserName(); NSString *rootPath = NSHomeDirectoryForUser(userName); NSLog(@"NSHomeDirectoryForUser:%@",rootPath); //Docume

iOS沙盒(sandbox)机制及获取沙盒路径

一. 每个iOS应用SDK都被限制在“沙盒”中,“沙盒”相当于一个加了仅主人可见权限的文件夹,苹果对沙盒有以下几条限制. (1).应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒. (2).应用程序间不能共享数据,沙盒里的文件不能被复制到其他应用程序文件夹中,也不能把其他应用程序文件夹中的文件复制到沙盒里. (3).苹果禁止任何读.写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中. (4).沙盒根目录里有三个文件夹:Documents,一般应该把应用程序的数据文件存到

iOS8沙盒路径的变化

iOS8中的的沙盒路径发生了变化 之前是这样的路径,通过NSHomedictionary()获取的家路径 /Users/wupeng/Library/Application Support/iPhone Simulator/7.1/Applications/F9093824FF-6D4C-4D73-884A-696514481F7C/Library/Caches/... 在iOS8中,家路径和Bundle路径进行了分离,也就是说在模拟器中,Bundle包路径和Document library所在

iOS学习7:iOS沙盒(sandBox)机制(一)之获取沙盒路径及目录说明(转)

转:http://my.oschina.net/joanfen/blog/151145 一.iOS沙盒机制 iOS的应用只能访问为该应用创建的区域,不可访问其他区域,应用的其他非代码文件都存在此目录下,包括图片,属性文件plist,bundle,nib文件等,这块区域称之为沙盒(sandBox). 每个应用都有属于自己的存储空间,即沙盒 应用只能访问自己的沙盒,不可访问其他区域 如果应用需要进行文件操作,则必须将文件存放在沙盒中,尤其是数据库文件,在电脑上操作时,可以去访问,但是如果要装在真机上

iOS之沙盒机制和如何获取沙盒路径

iOS APP可以在自己的沙盒里读写文件,但是,不可以访问其他APP的沙盒.每一个APP都是一个信息孤岛,相互是不可以进行通信的,唯独可以通过URL Scheme.沙盒里面的文件可以是照片.声音文件.文本.属性列表等. 沙盒机制简介 沙盒简述: 每一个APP都有一个存储空间,就是沙盒. APP之间不能相互通信. 沙盒根目录结构:Documents.Library.temp. 简述一下Documents.Library.temp的区别: Documents:用于存储用户数据,iTunes备份和恢复

iOS沙盒(sandbox)机制及获取沙盒路径

一.每个iOS应用SDK都被限制在沙盒中,沙盒相当于一个加了仅主人可见权限的文件夹,苹果对沙盒有以下几条限制. (1).应用程序可以在自己的沙盒里运作,但是不能访问任何其他应用程序的沙盒. (2).应用程序间不能共享数据,沙盒里的文件不能被复制到其他应用程序文件夹中,也不能把其他应用程序文件夹中的文件复制到沙盒里. (3).苹果禁止任何读.写沙盒以外的文件,禁止应用程序将内容写到沙盒以外的文件夹中. (4).沙盒根目录里有三个文件夹: Documents:一般应该把应用程序的数据文件存到这个文件

IOS 沙盒路径的机制

1.前往沙盒目录:在Finder上点->前往->前往文件夹,输入/Users/username/Library/Application Support/iPhone Simulator/  前往 2.沙盒结构:每个沙盒含有3个文件夹:Documents, Library 和 tmp. Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下,iTunes备份和恢复的时候会包括此目录Library:存储程序的默认设置或其它状态信息: Library/Caches:存放缓

iOS 8 之后的动态沙盒路径

在iOS8之前,我们获取到沙盒中的document.cache.tmp之后,下一次模拟器或真机无论重启多少次,这具体的路径是固定的,可是iOS8 之后,你要是在按原来的路径去找你想要的东西,我想它会把你坑的很惨.下面我就来说说自己的此次爬坑总结; 1>//获取沙盒路径 NSArray*path =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES); NSString*documentPath

沙盒路径 获取方式

Documents:用来保存用户生成的文件,其他数据以及其他程序不能重新创建的文件 Library:可以重新下载或者重新生成的文件 Tmp:临时存放的数据 沙盒路径的获取方式: 方法一:拼接路径 NSString *path = [NSHomeDirectory() stringByAppendingString:@"/Documents"]; 方法二:直接获取 ① 获取Documents路径 NSArray *paths = NSSearchPathForDirectoriesInD