沙盒本地数据化

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];

NSLog(@"%@",documentPathStr);

  • 第二种  : 首先获取沙盒主路径的地址,然后拼接上想要去的文件夹的地址.

//首先获取沙盒主路径的地址

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:strPath
atomically:YES
encoding:NSUTF8StringEncoding
error:nil];

  • 读取

//通过路径读取数据,使用stringWithContentsOfFile方法,在读取的时候,第一个参数表示读取文件的路径,第二个参数表示编码格式,第三个表示错误信息.

NSString
*newStr = [NSString
stringWithContentsOfFile:strPath
encoding:NSUTF8StringEncoding
error:nil];

——————————————NSData

/*

根据imageName获取图片:会在缓存里存一份,下次在获取同名图片,直接从缓存里取.
优点
:快
,只有第一次的时候慢
,但是之后再获取的话会很快.   
缺点
: 会浪费内存,
如果只用致辞的话这块内存就浪费掉了.

根据ContentsOfFile获取到的图片:
每次都会根据路径去取图片,不会占用内存.如果图片只使用一次,推荐使用ContentsOfFile

UIImage *image1 = [UIImage imageNamed:<#(nonnull NSString *)#>];

UIImage *image2 = [UIImage alloc]initWithContentsOfFile:<#(nonnull NSString *)#>];

123.png

[email protected]

[email protected]

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:stringPath
atomically:YES];

  • 读取数据

NSData
*newData = [NSData
dataWithContentsOfFile:stringPath];

UIImage
*newImage = [UIImage
imageWithData:newData];

UIImageView
*newImageView = [[UIImageView
alloc]initWithImage:newImage];

[self.view
addSubview:newImageView];



                                  复杂对象的写入与读取



             

 什么是复杂对象?

在Foundation框架内不存在的数据类,如自定义Person类等 无法在程序内通过writeToFile: 这个方法写入文件内

只能通过将负载对象转化为NSData,即归档

——————————————归解档

#import
<Foundation/Foundation.h>

//
如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议

@interface
Person :
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

//_+属性名
命名的成员变量

//

@end

#import
"Person.h"

@implementation
Person

//归档

//在归档和解档的时候,要把所有的属性都进行归解档

-(void)encodeWithCoder:(NSCoder
*)aCoder{

[aCoder encodeObject:self.name
forKey:@"name"];

[aCoder encodeObject:self.gender
forKey:@"gender"];

[aCoder encodeInteger:self.age
forKey:@"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];

//
如果一个对象向直接写入本地,那么这个对象需要遵守NSCoding协议

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

person.name
= @"男";

person.gender
= @"男";

person.age
= 38 ;

#pragma mark ------归档

//将复杂对象归档之后存入本地

//第
1
步:
创建一个NSMutableData ,用于保存归档后的对象(初始化归档工具)

NSMutableData
*data = [NSMutableData
data];

//第
2
步:
创建个归档工具

NSKeyedArchiver
*keyedArchiver = [[NSKeyedArchiver
alloc]initForWritingWithMutableData:data];

//第
3
步:
归档

[keyedArchiver
encodeObject:person
forKey:@"person"];

//第 4 步: 结束归档

[keyedArchiver
finishEncoding];//这时候才Data存储好数据

NSLog(@"data = %@",data);

//获取,拼接写入沙盒路径

NSString
*documentPathStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,
YES)objectAtIndex:0];

NSString
*dataPath = [documentPathStr
stringByAppendingPathComponent:@"person.plist"] ;

//x写入

[data
writeToFile:dataPath
atomically:YES];

#pragma mark --------解档并使用

//第
1 步:
从本地获取到Data

NSData  *newData = [NSData
dataWithContentsOfFile:dataPath];

NSLog(@"%@",newData);

//第
2
步:
通过获取到的data
创建一个解档工具

NSKeyedUnarchiver
*keyedUnarchiver = [[NSKeyedUnarchiver
alloc]initForReadingWithData:newData];

//第
3
步:创建一个Person对象,接收解档结果

Person
*newPerson = [keyedUnarchiver
decodeObjectForKey:@"person"];

//第
4
步:结束解档

[keyedUnarchiver finishDecoding];

//

NSLog(@"%@",newPerson);

//归解档是一种编码方式,不是数据本地化的方式

//负载对象写入本地实际上使用的还是writeToFile
的简单写入本地的方法

//整存整取
writeToFile

//在一个路径下存数据,最后一次存进去的东西会覆盖之前的



总结


  • 简单对象写入文件过程:
  1. 创建字符串获取存储文件的文件夹路径
  2. 创建需要存储的数据
  3. 创建字符串通过拼接创建并获得存储文件的路径
  4. 写入 writeToFile
  • 读取: 通过路径读取数据,使用stringWithContentsOfFile方法
  • 归档:
  1. 创建对象 (并设置属性)
  2. 遵循NSCoding协议,并实现方法
  3. 创建实例对象
  4. 创建NSData用来存储对象并初始化归档工具
  5. 创建归档工具
  6. 归档
  7. 结束归档
  8. 获取,拼接沙盒文件路径
  9. 写入
  • 解档
  1. 获取沙盒文件路径
  2. 创建NSData,并接收本地数据
  3. 创建解档工具,通过NSData
  4. 创建对象,并接收解档结果
  5. 结束解档
  • 什么类型的对象可以直接存入本地?
  1. NSString(在写入本地和读取时,都需要进行UTF8转码)
  2. NSArray
  3. NSDictionary
  4. NSData {
  • NSData如何转出UIImage :   imageWithData:NSData
  • UIImage如果转成NSData :   UIImageJPEGRepresentation(UIImage *, CGFloat);

}

  • 存入本地的过程?

1.找到存储的路径

2.创建要存储的数据

3.创建存储数据的内容

4.存储数据

数据本地化的方式 :

  1. 直接写入本地
  2. sqlite
  3. CoreData
  4. NSUserDefaultes(属性列表,并不是数据本地化的一个方式,但是可以达成数据本地化)

归解档

  • 传值的方式:
  1. block
  2. 代理
  3. 属性
  4. 单例
  5. 通知中心
  6. 数据本地化
  • 设计模式(实现方式)
  1. 单例
  2. 代理
  3. Target-Action
  4. 通知中心

MVC:框架的设计方式

任务

//通讯录 添加和删除 联系人时 下次打开有变化


documents(n.文档)

Directory( n. [计] 目录;)

Domain(n. 领域;域名;)

Component(n. 成分;组件;)

Representation(n. 代表;表现)

encode(vt. (将文字材料)译成密码;编码,)

decode(vt. [计][通信] 译码,解码)

?ī??v?

时间: 2024-10-26 12:54:49

沙盒本地数据化的相关文章

iOS中的 沙盒文件夹 (数据的写入和读取,归档和反归档)

AppDelegate.m - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { /** 沙盒中文件夹: 1.Documents : 存储长久保存的数据 2.library: Caches:存放的缓存,比如:视频,音频,图片,小说等等 Perferences:存储偏好设置,比如:应用程序是否是第一次启动 保存用户名和密码. 3.t

iOS 开发查看应用的沙盒文件

在iOS开发中,常常需要将一些信息保存到本地,比如说用户的一些搜索历史等.那么,如何查看所保存的文件呢? 这里介绍两种途径来查看应用的沙盒文件. 方法一:通过Xcode来查看,步骤如下: (1): Xcode中,点击 Window -> Devices (或者使用快捷键 command + shift + 2) (2): 选中自己的设备,也就是iPhone 手机,然后在 Installed Apps 中选中需要查看的应用.如下图: (3):滑动鼠标到 Installed Apps 的底部,左键点

【学习ios之路:UI系列】iOS沙盒机制,文件读取,归档与反归档

1.IOS中的沙盒机制 IOS中的沙盒机制是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 特点: 1.每个应用程序都在自己的沙盒内 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 每个沙盒含有3个文件夹:Documents, Library 和 tmp.Library包含Caches.Preferences目录.如下图

IOS 沙盒机制 浅析

IOS中的沙盒机制(SandBox)是一种安全体系,它规定了应用程序只能在为该应用创建的文件夹内读取文件,不可以访问其他地方的内容.所有的非代码文件都保存在这个地方,比如图片.声音.属性列表和文本文件等. 1.每个应用程序都在自己的沙盒内(提示:在IOS8中已经开放访问) 2.不能随意跨越自己的沙盒去访问别的应用程序沙盒的内容 3.应用程序向外请求或接收数据都需要经过权限认证 //获取home目录 NSString *homePath = NSHomeDirectory(); NSLog(@"h

iOS的沙盒机制

数据持久化:就是把数据从内存中写入到本地(对于iOS开发来说,就是把数据写入到应用的沙盒文件夹在中). 沙盒(SandBox):沙盒的本质就是文件夹,iOS采用沙盒机制来管理每一个安装到手机上的应用,每一个应用都有一个沙盒,而且这个沙盒相对独立,封闭的,安全的,通常情况下只有自己才能访问自己. 沙盒安全机制:沙盒的文件是随机生成的,而且每次都会生成一个沙盒的文件名,且采用十六进制数字命名法. #import "ViewController.h" #define kName @"

Sandbox沙盒

一.Sandbox沙盒特点: 1.应用程序之间相互隔离: 2.应用程序只能访问自己本地的内容,不能访问其他app文件目录结构(越狱手机除外): 3.为应用程序构建一个完整的运行空间: 4.应用程序有自己的缓存和数据备份. 二.沙盒目录结构: 1.Documnets: 2.HellWord.app 3.Library; 4.Tmp; 三.app所在沙盒Sandbox目录: 模拟器: ~/Library/Application Support/iPhone Simulator/6.0/Applica

浏览器沙盒是什么

是什么 沙盒(sandbox),另称沙箱,是一种按照安全策略限制程序行为的执行环境.“沙盒”技术的实践运用流程是:让疑似病毒文件的可疑行为在虚拟的“沙盒”里充分运行,“沙盒”会记下它的每一个动作:当疑似病毒充分暴露了其病毒属性后,“沙盒”就会执行“回滚”机制:将病毒的痕迹和动作抹去,恢复系统到正常状态. PS:sandbox并不是sandboxie,sandboxie是一种专业沙盒软件. 安全策略 1. 不能运行任何本地的的可执行程序. 2. 不能从本地计算机文件系统中读取任何信息,也不能往本地

iOS:沙盒、偏好设置、归档、解归档

一.沙盒和应用程序包 •iOS应用程序只能在为该改程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被称为沙盒 •iOS常用目录: –Bundle –Documents –Library/Caches –Library/Preference –tmp 显示mac隐藏文件:defaults write com.apple.finder AppleShowAllFiles -bool true 隐藏mac隐藏文件:defaults write com.apple.finder AppleSh

UI 沙盒机制 文件的读写操作

沙盒机制: 数据持久化的本质:将数据读成文件,存储在本地 沙盒机制:沙盒就是系统针对于每个应用程序在本地生成的文件夹(名字随机生成).对于不同的应用程序,不能访问其他应用程序沙盒内的内容.对于该应用内容起到保护作用. 沙盒内的文件夹: (1)Documents:用来存储长久保存的数据 (2)XXX.app: 应用程序的包,包含应用程序加载所需的所有资源,(readonly 只读,不可修改).平时使用的NSBundle就是该包. (3)Library: A: Caches:本地缓存,存储想暂时保存