[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(相对路径)
1.复杂对象遵循NSCoding协议
student.h
2.重写NSCoding的两个方法
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
其它信息的存储方法
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); // 任何地方都可以写 }
相关文章推荐
- ios开发之数据的持久化存储机制
- ios开发之数据的持久化存储机制
- ios开发之数据的持久化存储机制
- [IOS]Swift之沙盒与数据存储
- 黑马程序员——IOS学习九:ios开发之数据的持久化存储机制——黑马 ios 技术博客
- IOS学习之ios开发之数据的持久化存储机制
- iOS 数据持久化之使用NSUserDefaults存储数据
- IOS学习九:ios开发之数据的持久化存储机制
- IOS学习九:ios开发之数据的持久化存储机制
- iOS开发之数据持久化(iOS中常用的四种数据存储方式)
- ios开发之数据的持久化存储机制
- ios 沙盒 NSCoding 归档 数据存储
- ios开发之数据的持久化存储机制
- IOS 初级数据持久化-沙盒机制
- Xcode 4.5和iOS 6 - Core Data 持久化数据存储
- iOS 数据持久化之使用NSUserDefaults存储数据
- ios 沙盒 plist 数据的读取和存储
- ios 沙盒 preference 首选项 数据存储
- [iOS基础控件 - 6.11.5] 沙盒 & 数据存储
- ios 数据持久化之沙盒