初级数据持久化

1.App文件用来存储,你创建工程或开发时显示在左侧的所有内容。
在开发过程中可修改Bundle包得内容,在执行期间不容许修任何内容。
2、Library:存放缓存
3、tmp:临时性存储
4、Document:存储用户文件的首选目录

-Application - Name --这个目录是你的应用程序包,包括了nib文件,本地化资源,可以执行代码以及别的资源。


一:沙盒机制

1、每个应用程序位于文件系统的严格限制部分

2、每个应用程序只能在为该程序创建的文件系统中读取文件

3、每个应用程序在iOS系统内都放在了统一的文件夹目录下

二:沙盒路径位置

1、通过Finder查找程序沙盒相对路径

~/Library/Application Support/iPhone Simulator

2、通过代码查找沙盒相对路径

NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask,BOOL expandTilde);

三:对象归档的基本概念和用法

1、概念:对象回档是指将对象写入文件保存到硬盘上,当再次打开程序时,可以还原这些对象。你可以将称它为序列化、对象持久化。

2、数据持久性的方式

1)NSKeyedArchive ——————————对象归档

2)NSUserDefaults

3)属性列表化(NSArray、NSDictionary保存文件)

4)SQLite数据库、Core Data数据库

3、归档的形式()

1)对Foundation库中的对象进行归档

2)自定义对象归档(需要实现归档协议,NSCoding)

4、归档后的文件是加密的,属性列表是明文的。

下面我们实现一个model的归档和解档,创建一个Student类,必须遵循NSCoding协议,并且初始化方法,,便利构造器都写好。

Student.h文件:

#import <Foundation/Foundation.h>

@interface Student : NSObject<NSCoding,NSCopying>
@property (nonatomic,retain) NSString *name;
@property (nonatomic,retain) NSString *sex;
@property (nonatomic,assign) NSUInteger age;
+ (id)studentWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age;
@end

Student.m文件

#import "Student.h"

@implementation Student

- (void)dealloc{
    [_name release];
    [_sex release];
    _name = nil;
    _sex = nil;
    [super dealloc];
}

- (id)initWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age{
    if (self = [super init]) {
        _name = name;
        _sex = sex;
        _age = age;
    }
    return self;
}

+ (id)studentWithName:(NSString*)name sex:(NSString *)sex age:(NSUInteger)age{
    Student *stu = [[Student alloc] initWithName:name sex:sex age:age];
    return stu;
}
//归档协议或者称为序列化协议
- (void)encodeWithCoder:(NSCoder *)aCoder{
    [aCoder encodeObject:self.name forKey:@"name"];
    [aCoder encodeObject:self.sex forKey:@"sex"];
    NSNumber *num= [NSNumber numberWithInt:self.age];
    [aCoder encodeObject:num forKey:@"age"];
}
//解档,反序列化
- (id)initWithCoder:(NSCoder *)aDecoder{
    if (self = [super init]) {
        self.name = [aDecoder decodeObjectForKey:@"name"];
        self.sex = [aDecoder decodeObjectForKey:@"sex"];
        NSNumber *num = [aDecoder decodeObjectForKey:@"age"];
        self.age = [num intValue];
    }
    return self;
}
@end
归档:在主控制器里RootViewController.m里引入Student.h头文件

#import "RootViewController.h"
#import "Student.h"

@interface RootViewController ()

@end


#pragma mark archiveObject归档
//即将自己创建的model类型转化为二进制格式,通过二进制格式进行存储
- (void)archiveObject{

    Student *stu = [[Student alloc] init];
    stu.name = @"理想";
    stu.sex = @"女";
    stu.age = 38;
    //NSArray *arr = [NSArray arrayWithObject:stu];
    NSData *data =  [NSKeyedArchiver archivedDataWithRootObject:stu];

    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [path firstObject];

    str = [NSString stringWithFormat:@"%@/model",str];

    [data writeToFile:str atomically:YES];
    [stu release];
}
解档:

在主控制器里RootViewController.m里引入Student.h头文件

#import "RootViewController.h"
#import "Student.h"

@interface RootViewController ()

@end


#pragma mark unarchiveObject
//解档,将归档后的二进制文件解档为相对应的model对象
- (void) unarchiveObject{

    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *str = [path firstObject];

    str = [NSString stringWithFormat:@"%@/model",str];

    NSData *data = [NSData dataWithContentsOfFile:str];
    Student *model =  [NSKeyedUnarchiver unarchiveObjectWithData:data];
    NSLog(@"%@",model.name);
}

viewDidLoad

在viewDidload里面调用归档和解档方法。
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //[self searchDocument];
    //[self writeStr];
    //[self readArrayAndDictionary];
    //[self createArrayAndDictionary];
//    [self writeData];
//    [self readData];
//    [self userDefaultsWrite];
//    [self readDefautlts];
    [self archiveObject];
    [self unarchiveObject];
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章