数据存储

一、应用的 bundle和沙盒

1.基本信息:

  • bundle 和 沙盒都指的是两个文件目录
  • bundle 存放的是应用的可执行文件及其资源图片等
  • 沙盒目录可以用来数据存储和读取的操作
    注意:一个应用不允许访问其他应用的沙盒目录,只能在自己的沙盒中进行操作

2.沙盒的目录

Document:文档目录,用来存储一些比较重要的数据,由应用本身产生的数据,应用备份的时候,会备份到此文件目录下。注意 一些网络的缓存数据不能放到此目录下,否则,应用上架的时候会被拒绝
Library:此目录下有两个文件夹,Caches缓存目录,是用来保存从网上下载下来的需要持久化的数据,应用在备份的时候不会自动备份此目录,也不会自动删除此目录下的数据,需要程序内部提供删除缓存数据的操作。Preferences是用来保存用户的常用的数据,比如用户在登录的时候,可以将用户名和密码保存到此目录下,等到下次登录的时候,不用再输入账号密码,直接就可以自动登录了。
tmp:临时文件目录,用来保存临时文件的,系统会自动的删除此目录下的临时文件数据。


二、几种数据存储的方式:

  • 1、plist 文件存储数据:系统提供的字典数据等可以直接通过 writeToFile:的方式写入文件,使用简单方便,是偏好设置存储的基础
    写入:
    字典:
 // 1.准备数据!
   NSDictionary *dict = @{
                          @"name" : @"leige",
                          @"age"  : @18,
                          @"xifuer" : @(YES)
                          };
   
   // 2.写入plist文件!
   // 参数1 文件路径! -> documents
   // - 获取doc的路径
   NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
   // - 拼接文件的名称
   // stringByAppendingPathComponent -> 在documents的路径基础上拼接 /abc.plist!
   NSString *filePath = [docPath stringByAppendingPathComponent:@"/abc.plist"];
   
   NSLog(@"%@", filePath);
   // 参数2 原子属性 -> 设置为YES,必要安全.即使程序崩溃,数据写入也ok!
   [dict writeToFile:filePath atomically:YES];

数组:

// 1.准备数据!
   NSArray *arr = @[
                    @{
                        @"name" : @"jack",
                        @"age" : @"18"
                        },
                    @{
                        @"name" : @"rose",
                        @"age"  : @"21"
                        },
                    @{
                        @"name" : @"gebilaowang",
                        @"age"  : @"38"
                        }
                    ];
   
   // 2.写入plist文件!
   // 参数1 文件路径! -> documents
   // - 获取doc的路径
   NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
   // - 拼接文件的名称
   // stringByAppendingPathComponent -> 在documents的路径基础上拼接 /abc.plist!
   NSString *filePath = [docPath stringByAppendingPathComponent:@"/abc.plist"];
   
   NSLog(@"%@", filePath);
   // 参数2 原子属性 -> 设置为YES,必要安全.即使程序崩溃,数据写入也ok!
   [arr writeToFile:filePath atomically:YES];

读取:
字典:

   // 1.获取文件路径
   NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"abc.plist"];
   
   // 2.加载数据
   NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];

数组:

   // 1.获取文件路径
   NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject stringByAppendingPathComponent:@"abc.plist"];
 
   // 2.加载数据
   NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
  
  • 2、偏好设置存储数据:
    1.这是系统提供的 API,方便高效
    2.程序员不需要管理存储数据的路径及文件等信息,统一由系统自己负责
    3.偏好设置存储的本质是以字典的形式将数据写入到 plist 文件中
    存储
// 1.准备数据!
    NSInteger font = 16;
    NSString *age = @"20";
    NSString *score = @"120";
    
    // 1.通过偏好设置存储
    // 用户偏好 -> 单例!可以直接去存储数据!
    // -获取偏好设置对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    // - 存储信息
    [defaults setInteger:font forKey:@"yy_font"];
    [defaults setObject:age forKey:@"yy_age"];
    [defaults setObject:score forKey:@"yy_score"];
    
    // 同步 -> 保证数据立刻写入磁盘! iOS7以后就不需要写这行代码! 了解!
//    [defaults synchronize];

读取:

// 1.获取偏好设置对象
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    // 2.取出数据
    NSInteger font = [defaults integerForKey:@"yy_font"];
    NSString *age = [defaults objectForKey:@"yy_age"];
    NSString *score = [defaults objectForKey:@"yy_score"];

  • 3、归档&解档:
    它主要用于存储自定义类型的对象
    用法:
    首先需要遵守 NSCoding 协议
    实现协议方法,归档时调用:
- (void)encodeWithCoder:(NSCoder *)encoder

解档时调用:

- (instancetype)initWithCoder:(NSCoder *)decoder

你可能感兴趣的:(数据存储)