IOS 存储对象到本地和使用NSUserDefaults存储设置

 

  今天做了一些数据存储和读取的练习:归档(序列化)、反归档(反序列) 本地存储、NSUserDefaults存储、读取。那么现在总结一下使用经验。

 

一、文件操作

   在ios 设备上包含有闪存,它的功能就跟硬盘是一样的。当设备断电或关机后闪存上的数据依然会被保存下来。值得注意的是应用程序不能访问整个闪存。只能访问由系统分配给应用的一块闪存,也叫做沙箱(sendbox)。沙箱中有一些标准目录如:Documents 。下面我们会使用NSFileManager的实例去操作 Documents目录的文件。

1、创建文件夹&判断文件夹是否存在

step:

  1. 拿到Documents的path
  2. 获取即将创建的文件夹path
  3. 判断该文件夹是否存在
  4. 创建文件夹

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:

  1. 获取Documents的path
  2. 通过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:

  1. 创建GdInfo类文件
  2. GdInfo遵循NScoding协议
  3. 将GdInfo的实例转换为NSData
  4. NSString、NSData、NSArray及NSDictonary都提供了WriteToFIle 和initWithContentsOfFile 方法。而这里我们将GdInfo转为NSData后便可以使用NSData的WriteToFile来本地化对象了。
  5. 读取本地化对象
  6. 转为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"];

 

 

 

 

posted @ 2013-06-05 00:05  真是猿粪啊  阅读(1185)  评论(0编辑  收藏  举报