沙盒
iOS中每个应用程序都有一个独立的文件夹,这个文件夹就是沙盒。沙盒用来存储app的本地文件,例如:音频、视频、图片文件等。并且每个app的沙盒都是独立的,即当前app没有权限访问其他app的沙盒,所以说沙盒存储较之更安全。
AppName.app 应用程序的程序包目录,包含应用程序的本身。由于应用程序必须经过签名,所以不能在运行时对这个目录中的内容进行修改,否则会导致应用程序无法启动。
Documents/ 保存应用程序的重要数据文件和用户数据文件等。用户数据基本上都放在这个位置(例如从网上下载的图片或音乐文件),该文件夹在应用程序更新时会自动备份,在连接iTunes时也可以自动同步备份其中的数据。
Library:这个目录下有两个子目录,可创建子文件夹。可以用来放置您希望被备份但不希望被用户看到的数据。该路径下的文件夹,除Caches以外,都会被iTunes备份.
Library/Caches: 保存应用程序使用时产生的支持文件和缓存文件(保存应用程序再次启动过程中需要的信息),还有日志文件最好也放在这个目录。iTunes 同步时不会备份该目录并且可能被其他工具清理掉其中的数据。
Library/Preferences: 保存应用程序的偏好设置文件。NSUserDefaults类创建的数据和plist文件都放在这里。会被iTunes备份。
tmp/: 保存应用运行时所需要的临时数据。不会被iTunes备份。iPhone重启时,会被清空。
// 获取沙盒根目录路径
NSString *homeDir = NSHomeDirectory();
// 获取Documents目录路径
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) firstObject];
//获取Library的目录路径
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory,NSUserDomainMask,YES) lastObject];
// 获取cache目录路径
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES) firstObject];
// 获取tmp目录路径
NSString *tmpDir =NSTemporaryDirectory();
// 获取应用程序程序包中资源文件路径的方法:
NSString *bundle = [[NSBundle mainBundle] bundlePath];
NSLog(@"homeDir=%@ \n docDir=%@ \n libDir=%@ \n cachesDir=%@ \n tmpDir=%@ \n bundle=%@", homeDir,docDir, libDir, cachesDir, tmpDir, bundle);
KeepFresh[65867:19797012] homeDir=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Data/Application/B7A27452-97F7-4A1D-8DFA-910F79FCF21D
docDir=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Data/Application/B7A27452-97F7-4A1D-8DFA-910F79FCF21D/Documents
libDir=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Data/Application/B7A27452-97F7-4A1D-8DFA-910F79FCF21D/Library
cachesDir=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Data/Application/B7A27452-97F7-4A1D-8DFA-910F79FCF21D/Library/Caches
tmpDir=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Data/Application/B7A27452-97F7-4A1D-8DFA-910F79FCF21D/tmp/
bundle=/Users/wangtianliang/Library/Developer/CoreSimulator/Devices/5F5AAE8A-3B38-4BE7-8179-5EF0D0C21AB1/data/Containers/Bundle/Application/1D6A28B1-DC61-4439-A5CF-DF6DAF2D52D4/KeepFresh.app
然后输入路径。
打开documents,里面放着的是app的数据库文件
打开Library
Caches里缓存一般性的文件,iTunes不会备和恢复份此目录,该目录不会在应用退出是被清空。
打开里面发现有sdwebimage加载的图片。
Cookies:系统会自动将Safari或APP中网络请求的cookie保存为文件
Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。里面放着的是plist文件
plist文件是将将某些特定的类,通过XML文件的方式保存在目录中,这里放着的是偏好设置的plist文件,plist文件还可以放在其他地方。
可以被序列化的类型只有如下几种:
NSArray;NSMutableArray;NSDictionary;NSMutableDictionary;NSData;NSMutableData;NSString;NSMutableString;NSNumber;NSDate;
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
NSString *fileName = [path stringByAppendingPathComponent:@"demo.plist"];
NSArray *array = @[@"123", @"456", @"789"];
[array writeToFile:fileName atomically:YES];
NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
NSLog(@"%@", result);
这里还有NSUserDefaults
偏好设置存储,不需要路径,一般用于存储账号密码等信息。
// 获取偏好设置对象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//存储数据
[defaults setObject:@"xiaoming" forKey:@"name"];
[defaults setInteger:24 forKey:@"age"];
// 同步调用,立刻写到文件中,不写这个方法会异步,有延迟
[defaults synchronize];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *name = [defaults objectForKey:@"name"];
NSInteger *age = [defaults integerForKey:@"age"];
tmp这里放着的一些临时文件,可以看到我曾在相册选中的一些图片
归档
NSKeyedArchiver(归档)
归档一般都是保存自定义对象的时候,使用归档.因为plist文件不能够保存自定义对象.如果一个字典当中保存有自定义对象,如果把这个字典写入到文件当中,它是不会生成plist文件的.
// 存数据:
- (void)saveForNSKeyedArchiver {
Person *person = [[Person alloc] init];
person.name = @"小明";
person.age = 24;
// 获取沙盒目录
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"Person.data"];
NSLog(@"%@",tempPath);
[NSKeyedArchiver archiveRootObject:per toFile:filePath];
}
// 读数据:
- (void)readForNSKeyedArchiver {
// 获取沙盒目录
NSString *tempPath = NSTemporaryDirectory();
NSString *filePath = [tempPath stringByAppendingPathComponent:@"Person.data"];
Person *person = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@-----%li",per.name,per.age);
}
CoreData和Sqlite
SQlite就是一个轻量级的数据库
CoreData出现在iOS3中,是苹果推出的一个数据存储框架。CoreData提供了一种对象关系映射(ORM)的存储关系,类似于Java的hibernate框架。CoreData可以将OC对象存储到数据库中,也可以将数据库中的数据转化为OC对象,在这个过程中不需要手动编写任何SQL语句,这是系统帮我们完成。
CoreData最大的优势就是使用过程中不需要编写任何SQL语句,CoreData封装了数据库的操作过程,以及数据库中数据和OC对象的转换过程。所以在使用CoreData的过程中,很多操作就像是对数据库进行操作一样,也有过滤条件、排序等操作。
这就相当于CoreData完成了Model层的大量工作,例如Model层的表示和持久化,有效的减少了开发的工作量,使Model层的设计更加面向对象。