[iOS]数据持久化-沙盒存储

来源:互联网 发布:淘宝网如何开店铺步骤 编辑:程序博客网 时间:2024/06/05 17:28

一.沙盒机制
1.  每个应用程序位于文件系统的严格限制部分
2.  每个应用程序只能在为该程序创建的文件系统中读取文件
3.  每个应用程序在ios系统内都放在了统一的文件目录下
4.  沙盒路径的位置
1.  通过Finder查找程序沙盒相对路径
~/Library/ApplicationSupport/iPhone Simulator
2.  通过代码查找程序沙盒相对路径
NSSearchPathForDirectoriesInDomains(NSSearchPathDirectorydirectory, NSSearchPathDomainMask domainMask, BOOL expandTilde)

参数1:要搜索哪个文件夹(Document文件夹,tmp文件夹,Library文件夹)

参数2:获得iphone用户文件夹(固定为NSUserDomainMask)

参数3:YES(绝对路径)NO(相对路径)

// 获取沙盒路径    NSArray *paths =  NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
简单对象的读写

- (void)writeString{    // 获取路径    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSLog(@"path == %@",path);    // 取出路径    NSString *str = [path objectAtIndex:0];        // 字符串拼接 创建文件 text.txt    str = [NSString stringWithFormat:@"%@%@",str,@"/text.txt"];        // 要写入的字符串    NSString *value = @"蓝翔与杀马特的爱情史";        // 写入文件    NSError *error = nil;    [value writeToFile:str atomically:YES encoding:NSUTF8StringEncoding error:&error];        if (error) {        NSLog(@"error == %@",error);    }}#pragma mark - NSString 读取- (void)readString{    NSError *error = nil;    NSString *fileName = @"/text.txt";    NSArray *pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *path = [pathArray objectAtIndex:0];        path = [path stringByAppendingString:fileName];        NSString *str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];    if (error) {        NSLog(@"error == %@",error);    }    NSLog(@"str == %@",str);}
复杂对象的读写

1.复杂对象遵循NSCoding协议

student.h

#import <Foundation/Foundation.h>      // 1. 要存储对象 , 需要要遵循 NSCoding 协议@interface Student : NSObject <NSCoding>@property (nonatomic,retain) NSString *name;@property (nonatomic,retain) NSString *sex;@property (nonatomic,assign) NSInteger age;- (id)initWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age;@end

2.重写NSCoding的两个方法

- (void)encodeWithCoder:(NSCoder *)aCoder;- (id)initWithCoder:(NSCoder *)aDecoder;

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:(NSInteger)age
{
    if (self = [super init]) {
        self.name = name;
        self.sex = sex;
        self.age = age;
    }
    return self;
}
+ (id)studentWithName:(NSString *)name sex:(NSString *)sex age:(NSInteger)age
{
    Student *stu = [[Student alloc] initWithName:name sex:sex age:age];
    return [stu autorelease];
}
#pragma mark - NSCoding 协议必须实现的两个方法

#pragma mark - 归档协议(序列化协议)对象---》二进制
- (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"];
    
}
#pragma mark - 解档(反序列化)   二进制---》对象
- (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;
}
-(NSString *)description
{
    return [NSString stringWithFormat:@"姓名:%@,性别:%@,年龄:%d",_name,_sex,_age];
}
@end

MainViewController.m

#pragma mark - 复杂类型对象存储 ******************************************************************//归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。- (void)archiveObject{    Student *stu = [Student studentWithName:@"蓝翔" sex:@"女" age:16];        //归档,即将自己创建的model类对象,转换为二进制格式,通过二进制格式进行存储。    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stu];        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *str = [paths firstObject];    str = [NSString stringWithFormat:@"%@/student",str];        [data writeToFile:str atomically:YES];}// 解档,将归档后的二进制文件解档为相对应的model类型对象- (void)unarchiveObject{    // 解档,将归档后的二进制文件解档为相对应的model类型对象    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *str = [paths firstObject];    str = [NSString stringWithFormat:@"%@/student",str];        NSData *data = [NSData dataWithContentsOfFile:str];        Student *model = [NSKeyedUnarchiver unarchiveObjectWithData:data];    NSLog(@"%@",model);}

其它信息的存储方法

#pragma mark - 二进制存储 ************************- (void)writeData{    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *str = [arr firstObject];    str = [NSString stringWithFormat:@"%@/data",str];        NSString *value = @"蓝翔被菊爆啦,听说没";        // 转换成Data类型 二进制编码格式    NSData *data = [value dataUsingEncoding:NSUTF8StringEncoding];    // 写入文件    [data writeToFile:str atomically:YES];    }- (void)readData{    NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);    NSString *str = [arr firstObject];    str = [NSString stringWithFormat:@"%@/data",str];        NSData *data = [NSData dataWithContentsOfFile:str];    NSLog(@"data =  %@",data);        NSString *value = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];    NSLog(@"string =  %@",value);}#pragma mark - 轻量级存储#pragma mark - 存储登陆等信息- (void)userDefaultsWrite{    // 单例对象    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        [defaults setObject:@"蓝翔" forKey:@"name"];        // 同步存储 默认异步    [defaults synchronize];    }#pragma mark - 获取存储登陆等信息 ******************************************************************- (void)readUserDefaults{    NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];    NSLog(@"%@",value);    // 任何地方都可以写}





0 0
原创粉丝点击