- 数据存储
数据存储本质就是运行时的对象保存在文件、数据库中。数据存储可以分为两步:首先是将对象转换成二进制数据,这一步也叫序列化;相反,将二进制数据转换成对象则称为反序列化;然后是考虑二进制数据如何保存和读取。
iOS系统为每个App分配了独立的数据目录,App只能对自己的目录进行操作,这个目录所在被称为沙盒目录。
一个应用的沙盒包括下面三个部分:应用目录、沙盒目录、iCloud目录。
用于保存App的数据,包括App运行时需要的各类文件以及用户的数据等。Documents文件夹可以在连接iTunes时选择备份,通常Documents目录用来存放可以对外的文件。
用来保存不对外的数据
- Library/Caches 用来保存不对外的数据,存放程序运行时的缓存文件。比如通过网络请求下载的图片放到Caches中,再用到这个图片时不用再请求,直接加载。不可被iTunes备份。空间不足时可能会被iOS系统删除。
- Library/Preferences 通常用于保存用户的设置等信息,比如我们常用的NSUserDefaults类就会以plist的方式保存在该目录中,可被iTunes备份。
目录用来保存不重要的临时文件,在系统重启后会被清空。不会被iTunes备份。
- (void)sandbox:(NSString *)file writeData:(NSArray *)arr {
/**
数据存储到沙盒
*/
//初始化一个数据
//NSArray *array = @[@"data", @"storage"];
//2、获取沙盒根目录
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];//数组里的第一个,不止一个
//3、拼接文件名
NSString *filePath = [path stringByAppendingPathComponent:file];
//4、写入
[arr writeToFile:filePath atomically:YES];//是否原子性,YES表示写入成功之后再生成文件,NO表示不管写入成功与否都生成文件。
}
- (NSArray *)sandboxReadFrom:(NSString *)file {
/**
从沙盒中取数据
*/
//获取文件路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];//数组里的第一个,不止一个
NSString *filePath = [path stringByAppendingPathComponent:file];
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
NSLog(@"%@-----%@", filePath, arr);
return arr;
}
系统提供了NSFileManager类给开发去读取沙盒目录中的文件。
NSFileManager是单例,通过defaultManager方法可以获取:
NSFileManager *fileManager = [NSFileManager defaultManager];
拿到fileManager就可以判断文件是否存在,并且返回是文件还是文件夹:
[fileManager fileExistsAtPath:filepath1 isDirectory:&isDirectory];
遍历文件夹:
[fileManager contentsOfDirectoryAtPath:filePath error:&error];
复制或者移动文件:
[fileManager copyItemAtPath:sourceFilePath toPath:targetFilePath error:nil];
[fileManager moveItemAtPath:sourceFilePath toPath:targetFilePath error:nil];
更详细的API可以自行查看NSFileManager.h
文件。
在用NSFileManager去读取文件的时候需要提供文件路径,但是有时候我们并不知道资源被放置在哪个目录,此时可以用到NSBundle。
在Xcode编译运行的时候,会把Xcode内的图片、xib、音频等都拷贝到.app文件中。
NSBundle就是系统提供,用来读取这些资源的类。
NSBundle * mainBundle = [NSBundle mainBundle]
这样我们就拿到我们的mainBundle,通过mainBundle我们可以查找对应的资源:
NSString *path =[mainBundle pathForImageResource:@"some_pic_name"]; // 查找图片地址
也可以通过mainBundle直接加载xib:
[[NSBundle mainBundle] loadNibNamed:@"SSProgressView" owner:self options:nil];
通过CocoaPods安装的Pod库,要如何读取其资源
NSString *path = [[NSBundle mainBundle] pathForResource:@"SSTestPod" ofType:@"bundle"];
NSBundle *podBundle = [NSBundle bundleWithPath:path];
[NSUserDefaults standardUserDefaults] 是一个单例,通常用来存储用户的配置信息。本质其实就是一个字典类型的plist文件,不用关心路径,自动保存到Library下的Prefrences。
- (void)userDefaultWrite {
/**
它的本质其实就是一个字典类型的plist文件,不用关心路径,自动保存到Library下的Prefrences,单例
*/
[[NSUserDefaults standardUserDefaults] setObject:@"objcet" forKey:@"key"];
//[[NSUserDefaults standardUserDefaults] synchronize];//立即存储,iOS7之后不需要
}