ios学习记录 day36 UI12初级数据持久化(沙盒)

1.沙盒机制

文件夹之间不能通信

Finder前往 按Alt键 出来资源库

 

 

//返回类型是个数组 第一个参数是枚举,有很多文件夹类型   第三个参数YES的话是详细路径,NO的话~/最后一个文件夹名
//数组里放的是 同一文件下所有相同名字的文件夹 按角标取出我们要的

 NSArray *arr = NSSearchPathForDirectoriesInDomains(<#NSSearchPathDirectory directory#>, <#NSSearchPathDomainMask domainMask#>, <#BOOL expandTilde#>)

 

//返回bundle(.app)文件夹路径

-(NSString *)searchInBundle
{
    NSString *bundlePath = [[NSBundle mainBundle]pathForResource:@"InfoPlist" ofType:@"strings"];
    return bundlePath;
}
Bundle 程序运行时不可改 安装程序是只有这里有东西 用的时候把Bundle的东西拷贝到下面三个文件夹里用

Documents文件夹 存数据库 / coreData文件 限制不能超过20M

Library文件夹 caches存储图片 网址...  Preferences存储系统的配置文件NSUserDefaulfs

tmp文件夹 存储临时文件 老版本按home键自动清空 现在需要手动和上两个一样

 

 

 

2.简单对象的读写文件(NSString,Array,dic,set)

atomically 是否自动存储  encoding 编码格式(国际编码汉字一般用的 NSUTF8StringEncoding)   error:存储错误信息双指针类型

#pragma mark 字符串的写入 
-(void)writeWithString
{
    NSString *str = [self searchPath];
    //添加字符
//    NSString *newPath = [str stringByAppendingString:@"/text.txt"];
    //拼接字符
    NSString *newPath = [NSString stringWithFormat:@"%@/%@",str,@"text.txt"];
//    NSLog(@"newPath == %@",newPath);
    NSString *writeStr = @"xiaozhangdezifuchuan";
    
    NSError *error = nil;
    
    [writeStr writeToFile:newPath atomically:YES encoding:NSUTF8StringEncoding error:&error];//第四个参数直接写nil也可以
    if (error) {
        NSLog(@"error == %@",error);
    }
}

#pragma mark 字符串的读取
-(void)readWithString
{
    NSString *path = [self searchPath];
    NSString *newPath = [path stringByAppendingString:@"/text.txt"];
    
    NSError *error = nil;
    NSString *readStr = [NSString stringWithContentsOfFile:newPath encoding:NSUTF8StringEncoding error:&error];//+方法
    if (error) {
        NSLog(@"error ===== %@",error);
    }
    NSLog(@"read == %@",readStr);
    
    NSString *a = [[NSString alloc]initWithContentsOfFile:newPath encoding:NSUTF8StringEncoding error:&error];//-方法
    NSLog(@"a === %@",a);
    
}

 

//写入

1.创建要写入的内容

2.找路径 加新路径

3.写入方法writeToFile

4.调用

//读取

1.找路径 加名

2.读取方法ContentsOfFile

3.调用

 

 

//UIImage 转换成data类型

UIImage *image = [UIImage imageNamed:@"刘健.jpg"] ;
NSData *data = UIImagePNGRepresentation(image);

 

NSString *name = @"shengqingjun";
//字符串转换成2进制
NSData *data = [name dataUsingEncoding:NSUTF8StringEncoding];

 //2进制转换成字符串 只有一个方法
 NSString *str = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

 

 

3.复杂对象的读写文件(自定义model,有属性/在Foundation框架内不存在,无法通过writeToFile写入,至少有一个实例对象)

NSCoding协议

 

ABPersonInfo.m//自定义的类型

//归档的方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.age forKey:@"age"];
    [aCoder encodeObject:self.frame forKey:@"frame"];
}
//解档的方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.age = [aDecoder decodeObjectForKey:@"age"];
        self.frame = [aDecoder decodeObjectForKey:@"frame"];
    }
    return self;
}

 

FirstViewController.m

//归档对象
-(void)archiveObject
{
    ABPersonInfo *person = [[ABPersonInfo alloc]init];
    person.name = @"sqj";
    person.age = [NSNumber numberWithInt:12];
    person.frame = [NSValue valueWithCGPoint:CGPointMake(10, 20)];
    
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:person];
    
    NSString *path = [self searchPath];
    NSString *newPath = [path stringByAppendingString:@"/person.txt"];
    [data writeToFile:newPath atomically:YES];
}
//解档对象
-(void)unArchivedObject
{
    NSString *path = [self searchPath];
    NSString *newPath = [path stringByAppendingString:@"/person.txt"];
    NSData *data = [NSData dataWithContentsOfFile:newPath];
    //解档
    ABPersonInfo *person = [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"name == %@,age == %@,frame == %@",person.name,person.age,person.frame);
}

 

4.NSUserDefaults 系统的一个简单的本地存储 plist文件 存的东西比较小

#pragma mark -
#pragma mark NSUserDefaults 存储小型数据
//存储
-(void)writeUserDefaults
{
    NSUserDefaults *object = [NSUserDefaults standardUserDefaults];
    //[object setObject:@"shenqingjun" forKey:@"name"];//第一个参数 系统的对象
    //添加内容
    [object setObject:@"aishangyipiyema" forKey:@"xinqing"];
    //同步存储
    [object synchronize];
}
//读取
-(void)readUserDefaules{
    NSUserDefaults *object = [NSUserDefaults standardUserDefaults];
    NSString *name = [object objectForKey:@"name"];
    NSLog(@"name == %@",name);
}

 

 

以下为转载内容!

 iPhone 沙盒路径

默认情况下,每个沙盒含有3个文件夹:Documents, Library 和 tmp。
Documents:苹果建议将程序中建立的或在程序中浏览到的文件数据保存在该目录下;
Library:存储程序的默认设置或其它状态信息;
tmp:提供一个即时创建临时文件的地方。

iTunes在与iPhone同步时,备份所有的Documents和Library文件。
iPhone在重启时,会丢弃所有的tmp文件。

 1 //取得Documents路径的方法:  
 2 - (NSString *)documentFolder {  
 3     return [NSHomeDirectory() stringByAppendingPathComponent:@"Documents"];  
 4 }  
 5 //取得Documents中某个文件的路径  
 6 NSString *path = [[self documentFolder] stringByAppendingPathComponent:@"image.png"];  
 7 //补充:取得应用程序包(即bundle)的路径  
 8 - (NSString *)bundleFolder {  
 9     return [[NSBundle mainBundle] bundlePath];  
10 }  
11  
12  
13 //获取tmp目录
14 NSString *tempPath = NSTemporaryDirectory();

 

 

一、沙盒(sandbox)
出于安全的目的,应用程序只能将自己的数据和偏好设置写入到几个特定的位置上。当应用程序被安装到设备上时,系统会为其创建一个家目录,这个家目录就是应用程序的沙盒。

家目录下共有四个子目录:

Documents 目录:您应该将所有的应用程序数据文件写入到这个目录下。这个目录用于存储用户数据或其它应该定期备份的信息。
AppName.app 目录:这是应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以您在运行时不能对这个目录中的内容进行修改,否则可能会使应用程序无法启动。
Library 目录:这个目录下有两个子目录:Caches 和 Preferences
Preferences 目录包含应用程序的偏好设置文件。您不应该直接创建偏好设置文件,而是应该使用NSUserDefaults类来取得和设置应用程序的偏好
Caches 目录用于存放应用程序专用的支持文件,保存应用程序再次启动过程中需要的信息。
tmp 目录:这个目录用于存放临时文件,保存应用程序再次启动过程中不需要的信息。

获取这些目录路径的方法:
1,获取家目录路径的函数:
复制代码

    NSString *homeDir = NSHomeDirectory();


2,获取Documents目录路径的方法:
复制代码

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


3,获取Caches目录路径的方法:
复制代码

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
NSString *cachesDir = [paths objectAtIndex:0];


4,获取tmp目录路径的方法:
复制代码

NSString *tmpDir =  NSTemporaryDirectory();


5,获取应用程序程序包中资源文件路径的方法:
例如获取程序包中一个图片资源(apple.png)路径的方法:
复制代码

NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"apple" ofType:@"png"];
UIImage *appleImage = [[UIImage alloc] initWithContentsOfFile:imagePath];

代码中的mainBundle类方法用于返回一个代表应用程序包的对象。

二、文件IO

1,将数据写到Documents目录:

 1 - (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
 2     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 3     NSString *docDir = [paths objectAtIndex:0];
 4     if (!docDir) {
 5         NSLog(@"Documents directory not found!");        
 6         return NO;    
 7     }    
 8     NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
 9     return [data writeToFile:filePath atomically:YES];
10 }

2,从Documents目录读取数据:

1 - (NSData *)applicationDataFromFile:(NSString *)fileName {
2     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
3     NSString *docDir = [paths objectAtIndex:0];
4     NSString *filePath = [docDir stringByAppendingPathComponent:fileName];
5     NSData *data = [[[NSData alloc] initWithContentsOfFile:filePath] autorelease];
6     return data;
7 }

 

 

posted @ 2014-04-21 17:12  lxl奋小斗  阅读(232)  评论(0编辑  收藏  举报