一、应用沙盒

  • 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管理应用程序的数据模型,可以极大程度减少需要编写的代码数量。