iOS数据存储之偏好设置和属性列表

前言

在iOS开发中必不可少的要用到数据存储,数据的处理是iOS开发中的核心技术,适当的对数据进行持久化存储可以实现应用的离线功能,以此提高用户体验。所谓数据持久化,就是将数据保存到硬盘中,使得在应用程序或手机重启后可以继续访问之前保存的数据。在iOS开发中,有很多持久化得方案,接下来我将总结以下5种持久化方案:
1、plist(属性列表)
2、preference(偏好设置)
3、NSKeyedArchiver(归档)
4、SQList 3 (FMDB)
5、CoreData
由于偏好设置是将所有数据保存到preference目录下的一个以此应用包名来命名的plist文件中,所以将偏好设置和属性列表放到一块介绍。

沙盒机制

  • 在介绍各种存储方法之前,先说明下沙盒机制。iOS应用程序只能在为改程序创建的文件系统中读取文件,不可以去其他地方访问,此区域被称为沙盒,所以所有的非代码文件都要保持在此,例如图像,图标,声音,属性列表,文本文件等。
    1、目录结构
    1、“应用程序包”
    2、Documents
    3、Library
    Caches
    Preferences
    4、tmp
    2、目录结构分析
    • 应用程序包:包含所有的资源文件和可执行文件
      NSString *path = [[NSBundle mainBundle] bundlePath];
      NSLog(@"%@", path);
    • Documents:保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *path = [path objectAtIndex:0];
      NSLog(@"%@", path);
    • Library/Caches: iTunes不会同步此文件夹,适合存储体积大,不需要备份的非重要数据。
      NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES).firstObject;
      NSLog(@"%@", path);
    • Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。
    • tmp: iTunes不会同步此文件夹,系统可能在应用没运行时就删除该目录下的文件,所以此目录适合保存应用中的一些临时文件,用完就删除
      NSString *path = NSTemporaryDirectory();
      NSLog(@"%@", path);
属性列表(plist)

iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist。如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使用writeToFile:atomically:⽅法 直接将对象写到属性列表文件中该格式保存的数据可以直接使用NSDictionary和NSArray读取 。plist文件在iOS开发中属于Write写入方式,可以以Property List列表形式显示,也可以以xml格式显示。对于数据管理是很方便的。掌握使用plist文件数据操作很有必要

一、将数据写入plist文件
  • 获取文件路径
    NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *docPath = [path objectAtIndex:0];
    NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];
  • 存储
    NSArray *array = @[@"123", @"456", @"789"];
    [array writeToFile:fileName atomically:YES];
  • 读取
    NSArray *result = [NSArray arrayWithContentsOfFile:fileName];
    NSDictionary * result = [NSDictionary dictionaryWithContentsOfFile:fileName];
    NSLog(@"%@", result);

注意
只有NSString、NSDictionary、NSArray、NSData、 NSNumber等类型才能使用plist文件存储。
存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
plist文件的读写效率比较高,由于他的读写需要将所有的数据取出再全部保存,所以只适合小数据。

二、手动添加plist文件
  • 创建.plist文件。
    新建文件-->Resource-->Property List
plist.png

plist文件的根类型只能是NSArray或NSDictionary

GZO.jpg

可以在空白处右键“Add Row”添加数据或者点中“root”行,点击“+”号即可添加。一般数据类型(Type)可以选择Array、Dictionary、String等类型。同时也可以给添加的数据赋值(Value)。
除了以Property List列表形式显示外,选中usersList.plist文件,右键“Open As”-“Source Code”可以以XML格式显示。

2016.png
  • 将plist文件中的数据读入对应的根类型
    //1、获取文件所在的路径,Resource:文件名称、Type:文件格式
    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];
    // 2、从路径中获取对应格式的数据
    // 如果Root为NSArray,则使用数组保存
    NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];
    NSLog(@"%@",infos);
    // 如果Root为NSDictionary,则使用字典保存
    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];
    NSLog(@"%@",infoDic);
偏好设置
一、使用NSUserDefault 实现持久化
  • 下面来看下 NSUserDefault 本地保存的位置,Library/Preferences 这个目录下的 plist 文件就是其保存的目录。

  • NSUserDefault 的用法,主要是保存和读取数据
    //初始化一个 NSUserDefault
    + (NSUserDefaults *)standardUserDefaults;
    //设置数据的方法
    - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
    - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
    - (void)setFloat:(float)value forKey:(NSString *)defaultName;
    - (void)setDouble:(double)value forKey:(NSString *)defaultName;
    - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
    - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

  • 读取数据的方法:
    - (nullable id)objectForKey:(NSString *)defaultName;
    - (nullable NSString *)stringForKey:(NSString *)defaultName;
    - (nullable NSArray *)arrayForKey:(NSString *)defaultName;
    - (nullable NSDictionary<NSString *, id> *)dictionaryForKey:(NSString *)defaultName;
    - (nullable NSData *)dataForKey:(NSString *)defaultName;
    - (nullable NSArray<NSString *> *)stringArrayForKey:(NSString *)defaultName;
    - (NSInteger)integerForKey:(NSString *)defaultName;
    - (float)floatForKey:(NSString *)defaultName;
    - (double)doubleForKey:(NSString *)defaultName;
    - (BOOL)boolForKey:(NSString *)defaultName;
    - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

  • 删除数据的方法:
    - (void)removeObjectForKey:(NSString *)defaultName;

  • 保存数据:
    // 如果不手动调用,系统会自动保存,但时间不定
    - (BOOL)synchronize;

  • 使用方法

      //1.获得NSUserDefaults文件
      NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
      //2.向文件中写入内容
      [userDefaults setObject:@"AAA" forKey:@"a"];
      [userDefaults setBool:YES forKey:@"sex"];
      [userDefaults setInteger:21 forKey:@"age"];
      //2.1立即同步
      [userDefaults synchronize];
      //3.读取文件
      NSString *name = [userDefaults objectForKey:@"a"];
      BOOL sex = [userDefaults boolForKey:@"sex"];
      NSInteger age = [userDefaults integerForKey:@"age"];
    
  • 存储id类型数据

     + (void)setValue:(id)value andKey:(NSString *)key
     {
          NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
          [userDefaults setObject:value forKey:key];
          [userDefaults synchronize];
     }
     // 获取数据
     + (NSString *)getValueByKey:(NSString *)key
      {
          NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];
          NSString *value = [settings objectForKey:key];
          return value;
      }
    

注意:

  • 偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。
  • 如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。
  • 偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

欢迎阅读下一篇:

iOS-Ant-Bang互助社区 426981364
iOS技术交流群 461069757 欢迎加入!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 iOS本地缓存数据方式有五种: 1.直接写文件方式*.plist:可以存储的对象有NSString、NSAr...
    随心吧阅读 2,060评论 0 18
  • iOS应用数据存储的常用方式 XML属性列表(plist)归档 Preference(偏好设置) NSKeyedA...
    搁浅的青蛙阅读 458评论 0 0
  • NSUserDefaults适合存储轻量级的本地数据,比如要保存一个登陆界面的数据,用户名、密码之类的,个人觉得使...
    Clark_new阅读 2,181评论 2 7
  • iOS数据存储 持久化存储 概述: 持久化存储——将数据保存在硬盘里,当应用程序重启后可以访问到之前存储的数据。是...
    夏天的风_song阅读 653评论 1 7
  • 不久之前,我来到阳澄湖马术夏令营 , 第一天来的时候,我碰见了我四年没有见到的小同学顾恺元,我迫不及待地冲过...
    胡城瑄阅读 372评论 1 1