沙盒本地数据化
来源:互联网 发布:淘宝双12活动报名 编辑:程序博客网 时间:2024/06/02 18:46
model : 1 .怎么来的 2: 放在哪 3: 怎么用是一个好的方式
数据本地化 : 1: 什么事沙河,沙河都有哪些文件夹,作用是什么.
2: 什么事数据本地化,什么时候使用
3: 如何把一个数组,字典,字符串,NSData放入本地
4: 如何把一个Person对象存入本地
NSFileManger NSFileHandle(了解就行) ;
沙盒机制
——————————————沙盒
沙盒 : 每个iOS应用程序都会为自己创建一个文件系统目录(文件夹),这个独立,封闭,安全的空间 ,叫做沙盒
注意: 1: 每一个应用程序都会拥有一个应用程序沙盒
2: 应用程序沙盒就是一个系统目录
独立: 不可能出现两个程序公用同一个沙盒
封闭 : 每一个沙盒 都只能他自己的应用去使用
安全 :沙盒 有被删除的失效
手动自动存入东西
——————————————文件夹
文件夹
- Documents : 1: 存入一些永远不被删除的文件(不会被系统主动删除),itunes备份时,同时也会备份Documents文件(条件: 尽量不在Documents放入音频视频等太大的东西,只放一些重要文件,以免审核被拒) 注 :可以存,有方法让什么
- Library : 1 Caches : 存储缓存的文件夹 当用户对某一个URL做请求操作的时候,这个URL里面的东西会保存在主机里面的某个位置 . Cookie 和Session . (itunes不会备份此目录,文件不会再应用退出时删除,一般存放比较大,不是特别重要的资源)
2: Preferences 保存应用的所有偏好设置.iOS的Settings(设置) 应用会该目录中查找应用的设置信息,iTunes会备份它, 注意: 不应该直接创建偏好设置文件,而是应该使用类来取得和设置应用程序的偏好
- tmp : 保存应用运行时所需的临时数据,使用完毕后会将相应的文件从该目录删除.应用没有运行时或者手机重启时 ,系统也有可能会清除该目录下的文件,iTunes 不会同步该目录
获取文件夹方法
- 第一种 : 通过该NSSeach搜索文件夹得地址,能获取Documents 和Library 内部文件夹地址, 但是不能获取tmp文件夹得地址,其他的都可以获取到.
//NSDocumentDirectory 表示获取Documents文件夹得地址
//NSLibraryDirectory / NSCachesDirectory
//NSUserDomainMask 表示用户的主目录
//第三个参数表示展开"~"的地址,设置为YES为完整路径
//NSSearchPathForDirectoriesInDomains获取的是一个数组(NSArray<NSString *> *),数组只有一个元素,所以可以直接获取objectAtIndex: 0 ;
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
//NSLibraryDirectory / NSCachesDirectory
//NSUserDomainMask 表示用户的主目录
//第三个参数表示展开"~"的地址,设置为YES为完整路径
//NSSearchPathForDirectoriesInDomains获取的是一个数组(NSArray<NSString *> *),数组只有一个元素,所以可以直接获取objectAtIndex: 0 ;
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSLog(@"%@",documentPathStr);
- 第二种 : 首先获取沙盒主路径的地址,然后拼接上想要去的文件夹的地址.
//首先获取沙盒主路径的地址
NSString *homePathStr = NSHomeDirectory();
NSLog(@"homePathStr = %@",homePathStr);
//其次:在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
NSString *documentsPathStr = [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
NSLog(@"documents = %@",documentsPathStr);
//获取tmp文件夹得路径
NSString *tmpPathStr = NSTemporaryDirectory();
NSString *homePathStr = NSHomeDirectory();
NSLog(@"homePathStr = %@",homePathStr);
//其次:在沙盒主路径后拼接Documents,拼接出来documents文件夹的路径
NSString *documentsPathStr = [homePathStr stringByAppendingPathComponent:@"Library/Caches"];
NSLog(@"documents = %@",documentsPathStr);
//获取tmp文件夹得路径
NSString *tmpPathStr = NSTemporaryDirectory();
NSLog(@"tmpPathStr = %@",tmpPathStr);
简单对象的写入与读写
——————————————数据本地化
把数据的,存储到应用程序的沙盒里面
- 写入
//1 . 要知道存到哪里 ,So需要一个文件夹的路径
NSString *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSLog(@"%@",documentsPathStr);
//2 . 知道要存什么, 创建数据
NSString *str = @"hello world";
//3 . 要知道数据放哪里 , 创建一个路径,路径的终点局势存数据的文件Component(成分)
NSString *strPath = [documentsPathStr stringByAppendingPathComponent:@"str.txt"];
//4 . 写入操作
// atomically : YES正当手机没电关机 会保存文件
// NO 否
// encoding : 编码方式
[str writeToFile:strPathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
NSString *documentsPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSLog(@"%@",documentsPathStr);
//2 . 知道要存什么, 创建数据
NSString *str = @"hello world";
//3 . 要知道数据放哪里 , 创建一个路径,路径的终点局势存数据的文件Component(成分)
NSString *strPath = [documentsPathStr stringByAppendingPathComponent:@"str.txt"];
//4 . 写入操作
// atomically : YES正当手机没电关机 会保存文件
// NO 否
// encoding : 编码方式
[str writeToFile:strPathatomically:YESencoding:NSUTF8StringEncodingerror:nil];
- 读取
//通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,第一个参数表示读取文件的路径,第二个参数表示编码格式,第三个表示错误信息.
NSString *newStr = [NSString stringWithContentsOfFile:strPath encoding:NSUTF8StringEncodingerror:nil];
——————————————NSData
/*
根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取.优点 :快 ,只有第一次的时候慢 ,但是之后再获取的话会很快. 缺点 : 会浪费内存,如果只用致辞的话这块内存就浪费掉了.
根据ContentsOfFile获取到的图片:每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile
UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];
UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];
123.png
123@2x.png
123@3x.png
根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取.优点 :快 ,只有第一次的时候慢 ,但是之后再获取的话会很快. 缺点 : 会浪费内存,如果只用致辞的话这块内存就浪费掉了.
根据ContentsOfFile获取到的图片:每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile
UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];
UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];
123.png
123@2x.png
123@3x.png
2x和3x,表示分辨率区别
// png类型图片,只写名字就行了 写全png类型就指定了
*/
- 写入
//1
NSString *documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
//2
UIImage*image = [UIImage imageNamed:@"123"];
//将UIImage类型对象转化成NSData类型的
//第一个参数:转哪个UIImage类型对象
//第二个参数:压缩系数,越小压缩越厉害
NSData *data =UIImageJPEGRepresentation(image, 1);
//3
NSString *stringPath = [documentPathStr stringByAppendingPathComponent:@"stringPath.txt"];
//4
[data writeToFile:stringPathatomically:YES];
- 读取数据
NSData *newData = [NSData dataWithContentsOfFile:stringPath];
UIImage *newImage = [UIImageimageWithData:newData];
UIImageView *newImageView = [[UIImageViewalloc]initWithImage:newImage];
UIImage *newImage = [UIImageimageWithData:newData];
UIImageView *newImageView = [[UIImageViewalloc]initWithImage:newImage];
[self.viewaddSubview:newImageView];
复杂对象的写入与读取
什么是复杂对象?
在Foundation框架内不存在的数据类,如自定义Person类等 无法在程序内通过writeToFile: 这个方法写入文件内
只能通过将负载对象转化为NSData,即归档
——————————————归解档
#import<Foundation/Foundation.h>
//如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
@interfacePerson : NSObject<NSCoding>
@property(nonatomic,copy)NSString* name;
@property(nonatomic,copy)NSString* gender;
@property(nonatomic,assign)NSUInteger age;
//nonatomic assign copy atomic weak strong readonly readwrite writeonly nonnull nullable retain unsafe_unretained
//_+属性名命名的成员变量
//
@property(nonatomic,copy)NSString* name;
@property(nonatomic,copy)NSString* gender;
@property(nonatomic,assign)NSUInteger age;
//nonatomic assign copy atomic weak strong readonly readwrite writeonly nonnull nullable retain unsafe_unretained
//_+属性名命名的成员变量
//
@end
#import"Person.h"
@implementation Person
//归档
//在归档和解档的时候,要把所有的属性都进行归解档
-(void)encodeWithCoder:(NSCoder*)aCoder{
[aCoder encodeObject:self.nameforKey:@"name"];
[aCoder encodeObject:self.genderforKey:@"gender"];
[aCoder encodeInteger:self.ageforKey:@"age"];
}
//解档
-(instancetype)initWithCoder:(NSCoder*)aDecoder{
if (self = [super init]) {
self.name= [aDecoder decodeObjectForKey:@"name"];
self.gender= [aDecoder decodeObjectForKey:@"gender"];
self.age= [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
@implementation Person
//归档
//在归档和解档的时候,要把所有的属性都进行归解档
-(void)encodeWithCoder:(NSCoder*)aCoder{
[aCoder encodeObject:self.nameforKey:@"name"];
[aCoder encodeObject:self.genderforKey:@"gender"];
[aCoder encodeInteger:self.ageforKey:@"age"];
}
//解档
-(instancetype)initWithCoder:(NSCoder*)aDecoder{
if (self = [super init]) {
self.name= [aDecoder decodeObjectForKey:@"name"];
self.gender= [aDecoder decodeObjectForKey:@"gender"];
self.age= [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}
@end
#import"ViewController.h"
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
#import "Person.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// 如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议
Person *person = [[Person alloc]init];
person.name = @"男";
person.gender = @"男";
person.age = 38 ;
#pragma mark ------归档
//将复杂对象归档之后存入本地
person.name = @"男";
person.gender = @"男";
person.age = 38 ;
#pragma mark ------归档
//将复杂对象归档之后存入本地
//第1 步: 创建一个NSMutableData ,用于保存归档后的对象(初始化归档工具)
NSMutableData *data = [NSMutableDatadata];
//第2 步: 创建个归档工具
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
NSKeyedArchiver *keyedArchiver = [[NSKeyedArchiveralloc]initForWritingWithMutableData:data];
//第3 步: 归档
[keyedArchiverencodeObject:personforKey:@"person"];
//第 4 步: 结束归档
[keyedArchiverfinishEncoding];//这时候才Data存储好数据
NSLog(@"data = %@",data);
//获取,拼接写入沙盒路径
NSString*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES)objectAtIndex:0];
NSString *dataPath = [documentPathStr stringByAppendingPathComponent:@"person.plist"] ;
//x写入
[datawriteToFile:dataPathatomically:YES];
#pragma mark --------解档并使用
//第 1 步:从本地获取到Data
NSData *newData = [NSDatadataWithContentsOfFile:dataPath];
NSLog(@"%@",newData);
//第2 步: 通过获取到的data 创建一个解档工具
NSKeyedUnarchiver*keyedUnarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:newData];
//第3 步:创建一个Person对象,接收解档结果
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
//第4 步:结束解档
[keyedUnarchiver finishDecoding];
//
NSLog(@"%@",newPerson);
//归解档是一种编码方式,不是数据本地化的方式
//负载对象写入本地实际上使用的还是writeToFile的简单写入本地的方法
//整存整取writeToFile
#pragma mark --------解档并使用
//第 1 步:从本地获取到Data
NSData *newData = [NSDatadataWithContentsOfFile:dataPath];
NSLog(@"%@",newData);
//第2 步: 通过获取到的data 创建一个解档工具
NSKeyedUnarchiver*keyedUnarchiver = [[NSKeyedUnarchiveralloc]initForReadingWithData:newData];
//第3 步:创建一个Person对象,接收解档结果
Person *newPerson = [keyedUnarchiver decodeObjectForKey:@"person"];
//第4 步:结束解档
[keyedUnarchiver finishDecoding];
//
NSLog(@"%@",newPerson);
//归解档是一种编码方式,不是数据本地化的方式
//负载对象写入本地实际上使用的还是writeToFile的简单写入本地的方法
//整存整取writeToFile
//在一个路径下存数据,最后一次存进去的东西会覆盖之前的
总结
- 简单对象写入文件过程:
- 创建字符串获取存储文件的文件夹路径
- 创建需要存储的数据
- 创建字符串通过拼接创建并获得存储文件的路径
- 写入 writeToFile
- 读取: 通过路径读取数据,使用stringWithContentsOfFile方法
- 归档:
- 创建对象 (并设置属性)
- 遵循NSCoding协议,并实现方法
- 创建实例对象
- 创建NSData用来存储对象并初始化归档工具
- 创建归档工具
- 归档
- 结束归档
- 获取,拼接沙盒文件路径
- 写入
- 解档
- 获取沙盒文件路径
- 创建NSData,并接收本地数据
- 创建解档工具,通过NSData
- 创建对象,并接收解档结果
- 结束解档
- 什么类型的对象可以直接存入本地?
- NSString(在写入本地和读取时,都需要进行UTF8转码)
- NSArray
- NSDictionary
- NSData {
- NSData如何转出UIImage : imageWithData:NSData
- UIImage如果转成NSData : UIImageJPEGRepresentation(UIImage *, CGFloat);
}
- 存入本地的过程?
1.找到存储的路径
2.创建要存储的数据
3.创建存储数据的内容
4.存储数据
数据本地化的方式 :
- 直接写入本地
- sqlite
- CoreData
- NSUserDefaultes(属性列表,并不是数据本地化的一个方式,但是可以达成数据本地化)
归解档
- 传值的方式:
- block
- 代理
- 属性
- 单例
- 通知中心
- 数据本地化
- 设计模式(实现方式)
- 单例
- 代理
- Target-Action
- 通知中心
MVC:框架的设计方式
任务
//通讯录 添加和删除 联系人时 下次打开有变化
documents(n.文档)
Directory( n. [计] 目录;)
Domain(n. 领域;域名;)
Component(n. 成分;组件;)
Representation(n. 代表;表现)
encode(vt. (将文字材料)译成密码;编码,)
decode(vt. [计][通信] 译码,解码)
ćīŚǂvş
0 0
- 沙盒本地数据化
- 本地存储(数据持久化)
- iOS 本地数据持久化
- ScriptableObject 序列化本地数据
- 数据持久化--数据存储到本地
- ios 手动清除本地沙盒中的缓存数据
- iOS存数据到本地沙盒保存
- Neo4j 沙盒数据导入到本地 Neo4j 数据库
- python序列化数据本地存放
- ios实现 本地存储 数据持久化
- 初级数据持久化(本地存储)
- Unity PlayerPrefs 保存本地持久化数据
- IOS 本地储存(数据持久化)
- C# 序列化数据保存在本地
- iOS本地数据库(数据持久化)
- ios本地数据持久化方法
- 简单数据的本地持久化
- Unity本地持久化储存数据
- ZOJ 1048
- VIM配置Step By Step------Vundle篇
- 在linux的终端怎么退出python命令行
- 二叉树的遍历详解(前序中序后序层次-递归和非递归)
- TextView使用SpannableString设置复合文本
- 沙盒本地数据化
- android游戏开发基础
- 希尔排序
- 2016年笔记整理
- UIView的常用属性
- Hierbate 3.3+Spring 3.1 +SpringMVC+Myeclipse 10集成框架搭建
- sqlyog 快捷键
- group by 深入总结
- 从堆栈到参数传递