IOS 存储对象到本地和使用NSUserDefaults存储设置
今天做了一些数据存储和读取的练习:归档(序列化)、反归档(反序列) 本地存储、NSUserDefaults存储、读取。那么现在总结一下使用经验。
一、文件操作
在ios 设备上包含有闪存,它的功能就跟硬盘是一样的。当设备断电或关机后闪存上的数据依然会被保存下来。值得注意的是应用程序不能访问整个闪存。只能访问由系统分配给应用的一块闪存,也叫做沙箱(sendbox)。沙箱中有一些标准目录如:Documents 。下面我们会使用NSFileManager的实例去操作 Documents目录的文件。
1、创建文件夹&判断文件夹是否存在
step:
- 拿到Documents的path
- 获取即将创建的文件夹path
- 判断该文件夹是否存在
- 创建文件夹
code :
1 NSFileManager *fm =[[[NSFileManager alloc] init] autorelease]; 2 NSError * err= nil; 3 // 获取documents 的 path 4 NSString * documentPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 5 // 获取即将创建的文件夹 path 6 NSString * MyfolderPath = [documentPath stringByAppendingPathComponent:@"MyFolder"]; 7 // 判断文件夹是否存在 8 Boolean exists = [fm fileExistsAtPath:MyfolderPath]; 9 if(!exists){ 10 // 创建文件夹 11 [fm createDirectoryAtPath:MyfolderPath withIntermediateDirectories:NO attributes:nil error:&err]; 12 NSLog(@"创建成功"); 13 }else{ 14 NSLog(@"文件夹已存在"); 15 }
2、读取文件夹内的内容
step:
- 获取Documents的path
- 通过NSFileManage的实例 读取文件夹下 的内容
code:
1 NSFileManager * fm = [[[NSFileManager alloc]init] autorelease]; 2 NSError * err; 3 NSString * documentPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 4 //追加文件夹属性 5 NSString * MyfolderPath = [documentPath stringByAppendingPathComponent:@"MyFolder"]; 6 7 //读取文件和文件夹信息 8 NSArray * na = [fm contentsOfDirectoryAtPath:documentPath error:&err]; 9 10 NSLog(@"文件和文件夹内容:%@",na); 11 //读取文件和文件夹信息 & 子文件夹内的信息 12 NSArray * naa = [fm subpathsOfDirectoryAtPath:documentPath error:&err]; 13 14 NSLog(@"文件和文件夹内容及子目录内容:%@",naa);
3、本地 保存&读取文件
step:
- 创建GdInfo类文件
- GdInfo遵循NScoding协议
- 将GdInfo的实例转换为NSData
- NSString、NSData、NSArray及NSDictonary都提供了WriteToFIle 和initWithContentsOfFile 方法。而这里我们将GdInfo转为NSData后便可以使用NSData的WriteToFile来本地化对象了。
- 读取本地化对象
- 转为GdInfo 实体。
GdInfo.m:
1 // 2 // GdInfo.m 3 // FileUtilTest 4 // 5 // Created by 王 强 on 13-6-4. 6 // Copyright (c) 2013年 jon. All rights reserved. 7 // 8 9 #import "GdInfo.h" 10 11 @implementation GdInfo 12 @synthesize name,age; 13 #pragma make - 14 #pragma NScoding... 15 // 序列化 代理方法 16 -(void)encodeWithCoder:(NSCoder *)aCoder 17 { 18 [aCoder encodeObject:name forKey:@"name"]; 19 [aCoder encodeObject:age forKey:@"age"]; 20 } 21 -(NSString *)description 22 { 23 return [NSString stringWithFormat:@"name is %@, age is %@",name,age]; 24 } 25 // 反序列化代理方法 (init) 26 -(id)initWithCoder:(NSCoder *)aDecoder 27 { 28 self = [super init]; 29 if(self){ 30 31 self.name = [aDecoder decodeObjectForKey:@"name"]; 32 self.age = [aDecoder decodeObjectForKey:@"age"]; 33 } 34 return self; 35 } 36 @end
序列化:
1 -(IBAction)saveText:(id)sender 2 { 3 // 获取documents 的 path 4 5 NSString * documentPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 6 // MyFolder 文件夹 path 7 NSString * MyfolderPath = [documentPath stringByAppendingPathComponent:@"MyFolder"]; 8 //GdInfo实例 9 GdInfo *info = [[GdInfo alloc ]init]; 10 info.name = name.text; 11 info.age = age.text; 12 //序列化为 data 数据 13 NSData * infodata = [NSKeyedArchiver archivedDataWithRootObject:info]; 14 //获取路径 15 NSString * infofile = [MyfolderPath stringByAppendingPathComponent:@"infoData"]; 16 //写入 17 [infodata writeToFile:infofile atomically:NO]; 18 }
反序列化:
1 -(IBAction)readText:(id)sender 2 { 3 4 GdInfo * info = [[GdInfo alloc] init]; 5 // 获取documents 的 path 6 NSString * documentPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; 7 // MyFolder 文件夹 path 8 NSString * MyfolderPath = [documentPath stringByAppendingPathComponent:@"MyFolder"]; 9 //文件 10 NSString * infofile = [MyfolderPath stringByAppendingPathComponent:@"infoData"]; 11 //获取数据 12 NSData * infodata = [[NSData alloc]initWithContentsOfFile:infofile]; 13 //反序列化 14 info = [NSKeyedUnarchiver unarchiveObjectWithData:infodata]; 15 16 name.text = info.name; 17 age.text = info.age; 18 }
二、NSUserDefaults 存储和读取
NSUserDefaults (用户默认) 是被拿来作为用户参数的永久存储地方,当你的应用退出时,或设备关闭时,当前状态可以保存在NSUserDefaults中。
保存:
[[NSUserDefaultsstandardUserDefaults] setObject:name.text forKey:@"name"];
读取:
name.text = [[NSUserDefaultsstandardUserDefaults]objectForKey:@"name"];