最新消息:热烈庆祝IT小记上线!

文件存储

一.数据存储概述

iOS的文件存储采用的是“沙箱机制”,也就是应用程序只能访问自己的文件目录,每个应用程序的数据是独立的,就像一个一个的沙箱一样。这种管理方法比windows和原来的塞班那种文件管理方式更适合移动平台。这种方式更安全,在很大程度上避免了流氓软件和垃圾软件的盗窃资料。


查看模拟器应用程序在mac上的存储,就可以了解在iphone上文件是如何组织的。

打开目录/Users/andy/Library/Application Support/iPhone Simulator/5.1/Applications就会看到模拟器上的程序文件夹,你会看到iphone每个应用程序都有自己的3个目录(Document,Library,tmp)

Documents存放应用程序的数据。

Library目录下面还有Preferences和Caches目录,Preferences目录存放应用程序的使用偏好,Caches目录与Documents很相 是可以存放应用程序的数据。

tmp目录供应用程序存储临时文件。

二.数据读写

在应用程序中获得自己的documents目录:

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);NSString * documentDirectory = [paths objectAtIndex:0];

在上面的基础上,获得一个完整的文件路径和名字:

NSString * file = [documentDirectory stringByAppendingPathComponent:@"file1.txt"];

这就可以用file来创建,读取,和写入文件。



iOS中数据存储常见的有四种方式: 属性列表、对象归档、ios嵌入式数据库(SQLite3)和Core Data(苹果提供的工具)

1.用属性列表保存数据:

该方法就是针对一些集合类调用writeToFile:atomically方法和initWithContentsOfFile 方法来写入和读取数据。

这些集合类包括:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate。在这里输入代码太麻烦了,无法识别回车换行,所以这个就不在这里举例了。

2.归档方法保存自定义对象:

属性列表方法简单易用,但是使用有局限性,就是无法保存自定义的数据类。要解决这个问题,我们看归档方法。归档方法实际就是 用 NSKeyedArchiver 对 自定义类进行编解码成 NSMutableData 后,再对NSMutableData实行序列化具体的编解码是由NSCoder实现的。

三.具体实现

// 字符串读写
- (void)stringWrite
{
NSArray * pathArray = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString * path = [pathArray lastObject];
path = [path stringByAppendingString:@"/string.txt"];
NSString * str = @"dajiahao,\nwoshilulu";
NSError * error = nil;
BOOL judge = [str writeToFile:path atomically:YES encoding:NSUTF8StringEncoding error:&error];
if (judge) {
NSLog(@"存储成功");
}else{
NSLog(@"error == %@",error);
 }
}

#pragma mark -
#pragma mark 读取文件

- (void)readString
{
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingString:@"/string.txt"];
NSError * error = nil;
NSString * str = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:&error];
NSLog(@"%@",str);

}


// 写入NSData
- (void)writeData
{
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingString:@"/data"];
NSString * str = @"大家好";
// 先把字符串转换为二进制,再把二进制存入本地
NSData * data = [str dataUsingEncoding:NSUTF8StringEncoding];
[data writeToFile:path atomically:YES];


}
// 读取NSData
- (void)readData
{
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingString:@"/data"];
NSData * data = [NSData dataWithContentsOfFile:path];
NSString * str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"str == %@",str);

}


Book.h

@property (nonatomic,retain) NSString * title;
@property (nonatomic,retain) NSString * writer;

+ (Book *)BookWithTitle:(NSString *)title writer:(NSString *)writer;

Book.m

// 协议实现
// 归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.title forKey:@"title"];
[aCoder encodeObject:self.writer forKey:@"writer"];
}

// 解档
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
self.title = [aDecoder decodeObjectForKey:@"title"];
self.writer = [aDecoder decodeObjectForKey:@"writer"];
}
return self;
}

MainViewController.m

#pragma mark -
#pragma mark 归档与解档,序列化和反序列化

- (void)writeBookMode
{
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingString:@"/book"];
Book * book = [Book BookWithTitle:@"爱你的我" writer:@"陆陆"];
// 1.单独把对象归档,把对象转换为二进制文件
NSData * data = [NSKeyedArchiver archivedDataWithRootObject:book];
[data writeToFile:path atomically:YES];


// 2.创建一个数组,把对象放到数组里并把数组转换为二进制文件,然后写入数组,可以存储多个对象
// NSArray * arr = [NSArray arrayWithObject:book];
// [arr writeToFile:path atomically:YES];
// NSData * data = [NSKeyedArchiver archivedDataWithRootObject:arr];
// [data writeToFile:path atomically:YES];

}

- (void)readBookMode
{
NSString * path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingString:@"/book"];
NSData * data = [NSData dataWithContentsOfFile:path];
Book * book = [NSKeyedUnarchiver unarchiveObjectWithData:data];
NSLog(@"title == %@\n writer == %@",book.title,book.writer);

}


猜您喜欢

备案号:苏ICP备12016861号-4