属性列表(plist)

  iOS提供了一种plist格式的文件(属性列表)用于存储轻量级的数据,属性列表是一种XML格式的文件,拓展名为plist。如果对象是NSString、NSDictionary、NSArray、NSData、 NSNumber等类型,就可以使用writeToFile:atomically:⽅法 直接将对象写到属性列表文件中该格式保存的数据可以直接使用NSDictionary和NSArray读取 

(一)、使用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文件。

 

(二)、手动添加plist文件

      新建文件-->Resource-->Property List

       

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

     

    

      将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);

(三)、直接讲数据写入plist文件

      由于 NSUserDefault 本质上就是通过 plist 文件来实现属性的持久化。所以,我们可以通过自己创建一个 plist 文件来实现属性的持久化。

        NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *docPath = [path objectAtIndex:0];

        NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];

        NSMutableDictionary *contentDic;

        // 判断本地是否存在 plist 文件
   if ([[NSFileManager defaultManager] fileExistsAtPath:myFile] == NO) {
   NSFileManager* fm = [NSFileManager defaultManager];
    // 创建一个文件
   [fm createFileAtPath:myFile contents:nil attributes:nil];
   contentDic = [[NSMutableDictionary alloc] init];
   } else {
    contentDic = [[NSMutableDictionary alloc] initWithContentsOfFile:myFile];
   }
    // 数据的读写操作
   [contentDic setObject:@"1234" forKey:@"passWord"];
   // 将修改都的数据保存到 plist 文件中
   [contentDic writeToFile:myFile atomically:YES];

(四)、总结
    plist文件的读写效率比较高,由于他的读写需要将所有的数据取出再全部保存,所以只适合小数据。

iOS数据持久化存储之属性列表的更多相关文章

  1. HTML5 Canvas 数据持久化存储之属性列表

    属性列表想必大家都不会陌生,正常用 HTML5 来做的属性列表大概就是用下拉菜单之类的,而且很多情况下,下拉列表还不够好看,怎么办?我试着用 HT for Web 来实现属性栏点击按钮弹出多功能选框, ...

  2. iOS数据持久化存储:归档

    在平时的iOS开发中,我们经常用到的数据持久化存储方式大概主要有:NSUserDefaults(plist),文件,数据库,归档..前三种比较经常用到,第四种归档我个人感觉用的还是比较少的,恰恰因为用 ...

  3. 转载 -- iOS数据持久化存储

    作者:@翁呀伟呀 授权本站转载 概论 所谓的持久化,就是将数据保存到硬盘中,使得在应用程序或机器重启后可以继续访问之前保存的数据.在iOS开发中,有很多数据持久化的方案,接下来我将尝试着介绍一下5种方 ...

  4. iOS数据持久化存储

    本文中的代码托管在github上:https://github.com/WindyShade/DataSaveMethods 相对复杂的App仅靠内存的数据肯定无法满足,数据写磁盘作持久化存储是几乎每 ...

  5. IOS数据持久化存储之SQLite3第三方库FMDB的使用

    SQLite是一种小型的轻量级的关系型数据库,在移动设备上使用是非常好的选择,无论是Android还是IOS,都内置了SQLite数据库,现在的版本都是SQLite3.在IOS中使用SQLite如果使 ...

  6. iOS数据持久化存储之归档NSKeyedArchiver

    归档是一种很常用的文件储存方法,几乎任何类型的对象都能够被归档储存(实际上是一种文件保存的形式),收集了网上的一些资料并结合自己的一些经验,总结如下. 一.使用archiveRootObject进行简 ...

  7. iOS数据存储之属性列表理解

    iOS数据存储之属性列表理解 数据存储简介 数据存储,即数据持久化,是指以何种方式保存应用程序的数据. 我的理解是,开发了一款应用之后,应用在内存中运行时会产生很多数据,这些数据在程序运行时和程序一起 ...

  8. iOS开发——数据持久化Swift篇&使用Core Data进行数据持久化存储

    使用Core Data进行数据持久化存储   一,Core Data介绍 1,Core Data是iOS5之后才出现的一个数据持久化存储框架,它提供了对象-关系映射(ORM)的功能,即能够将对象转化成 ...

  9. 数据存储之属性列表Plist

    常用的数据存储有属性列表.偏好设置.归档.sqlite.coreData.上一博客了解了沙盒,现在了解下属性列表Plist. 通常通过NSArray.NSDictionary集合类的WriteToFi ...

随机推荐

  1. 每天一个 Linux 命令(57):ss命令

    ss是Socket Statistics的缩写.顾名思义,ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容.但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信 ...

  2. js中推断浏览器类型

    在实际看发展.有时候会遇到在IOS和Android中要用不同的方法处理网页.须要让网页返回当前浏览器的类型. /** * 推断浏览器类型 */ var Browse = function () { / ...

  3. Linux系统编程_1_文件夹读取(实现简单ls命令)

    闲来无事.随便写写,实现简单的ls命令: | 1 #include <stdio.h> | 2 #include <stdlib.h> | 3 #include <dir ...

  4. 深入了解Struts1的执行机理

    要说Struts1的工作流程.就必需要说一下Model1和Model2了.由于这个框架是踏着他们的尸骨一步一步的发展起来的. Model1开发模式,想想我们刚刚開始接触Java的时候,我们用的就是这样 ...

  5. jquery列表自动加载更多

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. git 操作分支

    1. git 查看本地分支:git branch 2. git 查看所有分支:git branch -a 3. git 新建本地分支:git branch branchName 4. git 新建分支 ...

  7. 前端PC页面,移动端页面问题笔记~~

    <!DOCTYPE html> <html> <head> <meta charset="gbk"/> <meta name= ...

  8. VMware厚置备延迟置零,厚置备置零,精简置备具体解释

    本文具体介绍VMware厚置备延迟置零,厚置备置零,精简置备的概念及选择使用 1.厚置备延迟置零(zeroed thick) 以默认的厚格式创建虚拟磁盘.创建过程中为虚拟磁盘分配所需空间.创建时不会擦 ...

  9. HDFS源码分析心跳汇报之数据结构初始化

    在<HDFS源码分析心跳汇报之整体结构>一文中,我们详细了解了HDFS中关于心跳的整体结构,知道了BlockPoolManager.BPOfferService和BPServiceActo ...

  10. 【转】【Axure学习】之短信动态验证码+图片动态验证码

    感谢:努力拼搏的80后的<巧用Axure三步轻松搞定图片验证码>. 人人都是产品经理的<Axure 教程:实现倒计时获取验证码效果>