码迷,mamicode.com
首页 > 移动开发 > 详细

[IOS:OC]数据存储:文件/用户配置/归档的作用以及用法实例

时间:2015-11-06 20:46:36      阅读:340      评论:0      收藏:0      [点我收藏+]

标签:

首先得了解SandBox沙盒 本质就是一个提供给我们app的专用文件夹
我们可以获取到沙盒的path:NSString *home = NSHomeDirectory();

打印出来复制可以通过Finder-前往-前往文件夹就看可以找到在mac下该项目沙盒的位置了
各位刚接触ios的童鞋应该知道在Bundle中包含了所有的资源文件和可执行文件
在沙盒目录下我们可以看到三个文件夹Documents、

Library以及tmp,其中Library下还包含两个目录:

Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应

用可将游戏存档保存在该目录

Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般

存储体积较大、不需要备份的非重要数据

Library/Preference:保存应用的所有偏好设置,iOS的设置应用会在该目录中查找应用的设置信息。

iTunes同步设备时会备份该目录

tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系

统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录

实例:

#import "ViewController.h"
#import "Person.h"
@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    //文件  plist
    //获取沙盒path
    NSMutableDictionary *dic;
    //获取到沙盒路径 追加上沙盒下的documents目录 以及该目录下的一个文件
    NSString *path=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/cities.plist"];
    NSLog(@"%@",path);//可以看到app沙盒在mac下的位置
    //判断文件是否存在
    if(![[[NSFileManager alloc]init] fileExistsAtPath:path])
    {
        //文件不存在即从远程服务器获取  这里在本地bundle放了一个名为cities的plist文件用来获取作为示例
        dic=[NSMutableDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cities" ofType:@"plist"]];
    }
    else
    {
        //文件存在则读取
        dic=[NSMutableDictionary dictionaryWithContentsOfFile:path];
    }
    NSLog(@"读取到的文件%@",dic);
    //写入文件到沙盒 writetofile 该方法同样可用于nsstring array data等
    [dic writeToFile:path atomically:YES];
    
    //--------------------------------
    
    //用户配置  使用NSUserDefaults
    //我们可以再里面保存用户名以及密码实现保存登录状态
    [[NSUserDefaults standardUserDefaults] setObject:@"abc" forKey:@"username"];
    [[NSUserDefaults standardUserDefaults] setObject:@"123" forKey:@"password"];
    //读取
    NSString *uName=[[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
    
    //在info.plist中保存有版本信息 使用用户配置保存版本信息来核对是否第一次打开app以显示特性
    //通常在AppDelegate中进行判断
    
    //获取info中的版本信息
    NSDictionary *infoDic=[[NSBundle mainBundle] infoDictionary];
    NSString *str=infoDic[@"CFBundleShortVersionString"];//app版本信息
    //接下来判断用户配置中是否有版本信息 如果有是否和当前app版本信息相同 如果没有或者不同则表示第一次打开该版本的app则显示特性介绍
    
    //--------------------------------
    
    //归档 解档
    NSString *dataPath=[NSHomeDirectory() stringByAppendingPathComponent:@"Documents/info.m" ];
    //通常用来将自定义存放在文件中
    //这里我们定义一个Person类为例子 自定义类需要遵守NSCoding协议实现·encodeWithCoder initWithCoder两个方法
    Person *p=[[Person alloc]init];
    [p setName:@"Liu"];
    [p setAge:15];
    NSMutableData *data=[NSMutableData data];//用来存放编码后的数据
    //创建一个归档器
    NSKeyedArchiver *arch=[[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [arch encodeObject:p forKey:@"Person"];//将person对象编码并设置一个key
    [arch finishEncoding];//需要结束编码
    //写入到文件
    [data writeToFile:dataPath atomically:YES];
    
    //解档
    NSKeyedUnarchiver *uarch=[[NSKeyedUnarchiver alloc]initForReadingWithData:[NSData dataWithContentsOfFile:dataPath]];
    Person *per=[uarch decodeObjectForKey:@"Person"];
    NSLog(@"%@----%d",per.name,per.age);
}


@end
person类 包含name和age两个属性:
#import "Person.h"
@interface Person()<NSCoding>

@end
@implementation Person
-(id)initWithCoder:(NSCoder *)aDecoder
{
    if(self=[super init])
    {
        _name=[aDecoder decodeObjectForKey:@"name"];
        _age=[[aDecoder decodeObjectForKey:@"age"] integerValue];
    }
    return self;
}
-(void)encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:_name forKey:@"name"];
    [aCoder encodeObject:@(_age) forKey:@"age"];
}
@end

[IOS:OC]数据存储:文件/用户配置/归档的作用以及用法实例

标签:

原文地址:http://www.cnblogs.com/A-Nian/p/4943436.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!