您的位置:首页 > 移动开发 > IOS开发

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

2014-07-09 20:16 441 查看
一.沙盒机制

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);
// 任何地方都可以写
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: