一、应用沙盒
-
1、概念:
-
每个iOS应用都有自己的应用沙盒(应用沙盒就是应用的文件夹)。与其他应用系统隔离,应用必须待在自己的沙盒里,其他应用不能访问该沙盒。
-
2、 如何去访问iOS应用的沙盒?
执行这个语句,可以打印应用沙盒的路径:NSString *str = NSHomeDirectory();
NSLog(@“沙盒路径:%@”,str);
可以发现每次打印的沙盒路径都是变化的,但是访问的还是同一个应用的沙盒路径。
- 3、可以发现访问的应用沙盒的系统文件目录。假设应用的名称叫Layer。有Documents、Library、SystemData、temp
- 4、 那么这四个文件夹的区别是什么呢?
- 1> 应用程序包:(上图中的Layer),包含了所有的资源文件和可执行文件。
- 2> Documents:保存应用运行时生成的需要持久化的数据,iTunes 同步设备时就备份该目录。例如:游戏应用可将游戏存档保存在该目录。
- 3> tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes 同步设备时不会备份该目录。
- 4> Library / Caches:保存应用运行时生成的需要持久化的数据,ITunes 同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据。
- 5> Library / Preference:保存应用的所有偏好设置。iOS 的setting(设置)应用会在该目录中查找应用的设置信息。iTunes 同步设备时会备份该目录。
二、iOS应用数据存储的常用方式
- XML属性列表(plist文件)
- Preference(偏好设置)
- NSKeyArchiver归档
- SQLite3
- Core Data
1、什么数据能够做 plist 存储?
- 数组、字典和字符串有 writeToFile:这个方法,可以存储 plist文件中的数据。
- 字符串虽然能够做 plist 存储,但是 plist 本身不支持字符串
2、获取沙盒中的文件路径
//这里写了一个宏,表示文件中全局可用,访问到的是文件名为 contacts.data 这个文件。
#define kFilePath [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contacts.data"]
// NSUserDomainMask 代表从用户文件夹下找
// YES 代表展开路径中的波浪字符~
注意: 路径必须展开(搜索路径的时候,第三个参数一定是 YES),如果为 NO 的话,系统会将应用的沙盒路径替换成波浪号~
2、偏好设置
- 不需要关心文件名
- 快速做键值对的存储
- 底层使用的 NSUserDefaults 来实现数据的存储
// 使用 NSUserDefaults 来保存开关的状态
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setObject:self.remindPwdSwich.isOn ? @"Y" : @"N" forKey:@"remindOn"];
[userDefaults setObject:self.autoLoginSwich.isOn ? @"Y" : @"N" forKey:@"autoLoginOn"];
[userDefaults setObject:self.userNameTF.text forKey:@"userName"];
[userDefaults setObject:self.passwordTF.text forKey:@"password"];
[userDefaults synchronize]; //立即写入
3、归档、解档
- 如果存储自定义对象,一定要用解、归档的操作。
- plist、偏好设置都不好使。
- 自定义对象解、归档的时候一定要遵守协议
- 解析文件就会调用 initWithCoder:方法。
- 在解档属性的时候,一定要为属性 赋值。
//归档联系人信息
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contacts.data"];
NSError *error = nil;
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:self.contacts requiringSecureCoding:YES error:&error];
if (error) {
NSLog(@"归档失败,失败的原因是:%@",error);
} else {
BOOL success = [data writeToFile:filePath atomically:YES];
if (success) {
NSLog(@"写入成功");
} else {
NSLog(@"写入失败");
}
}
//解档
NSError *error = nil;
NSData *data = [NSData dataWithContentsOfFile:filePath];
self.contacts = [NSKeyedUnarchiver unarchivedObjectOfClass:[Contact class] fromData:data error:&error];
if (!error) {
NSLog(@"解档成功");
} else {
NSLog(@"解档失败");
}
3、SQLite3
- SQLite3只是一个轻型的嵌入式数据库引擎,占用资源非常低,处理速度比Mysql还快,专门用于移动设备上进行适量的数据存取,它只是一个文件,不需要服务器进程。
4、Core Data - Core Data是iOS5之后才出现的一个框架,提供了直接使用SQLite数据库的大部分灵活性,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象,通过CoreData管理应用程序的数据模型,可以极大程度减少需要编写的代码数量。