转载

ios开发----应用数据存储的常用方法之plist存取方法

[注意]转载时请注明出处 博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/

ios应用数据存储的常用方式主要有:

  • XML属性列表(plist)归档
  • Preference(偏好设置)
  • NSKeyedArchiver归档(NSCoding)
  • SQLite3
  • Core Data

ios应用沙盒机制

介绍这些方法之前,首先介绍一下 应用沙盒 的概念.

ios应用沙盒机制就是指ios应用程序只能在为该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。(ios8之前是这个样子,iOS8新开放了一种对几个固定系统区域的扩展机制extension,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制).

应用沙盒机制下,每个应用程序都有自己的存储空间 ;应用程序不能翻过自己的围墙去访问别的存储空间的内容 ;应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。

应用沙盒的结构主要如下:

ios开发----应用数据存储的常用方法之plist存取方法

Documents :保存应用运行时生成的需要持久化的数据,iTunes同步设备时 会备份该目录 。例如,游戏应用可将游戏存档保存在该目录

tmp :保存应用运行时所需的 临时数据 ,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录

Library/Caches :保存应用运行时生成的需要持久化的数据,iTunes同步设备时 不会备份该目录 。一般存储体积大、不需要备份的非重要数据

Library/Preference :保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时 会备份该目录

ios应用沙盒目录常见获取方式

在介绍plist文件存取方式之前,还有一个问题需要提前介绍,一会也需要用到,就是我们怎么获取用于沙盒的目录,也有多种方式,

获取应用沙盒根目录 的方法:

//获取应用沙盒的根目录 NSString *home = NSHomeDirectory(); //NSHomeDirectory()是一个c语言的方法

获取Documents文件路径 的方法:

    • 第一种方法:
      • 首先,获取应用沙盒的根目录,再利用字符串的拼接函数,得到Documents目录 ( 但是不建议采用这个方法 ,因为新版本的操作系统可能会修改目录名)
1     //第一种方法: 2     //获取当前应用沙盒的根目录 3     NSString *homePath = NSHomeDirectory(); 4     //拼接路径 5     NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];  
    • 第二种方法

      • 利用NSSearchPathForDirectoriesInDomains函数获得Documents目录
//第二种方法     NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];

这个NSSearchPathForDirectoriesInDomains函数一共有 三个参数(注意返回的是一个数组) , 第一个参数 是代表获取什么文件的路径(枚举选择就可),系统已经帮我们封装好. 第二个参数 代表从用户文件夹下找, 第三个参数 代表查找时文件是否展开,这个参数一般就填为yes,否则的话可能找不到路径,通过no,获取的路径,系统会将前面的路径换为一个~,如下图:

ios开发----应用数据存储的常用方法之plist存取方法

正常情况下,为YES的情况输出如下图:

ios开发----应用数据存储的常用方法之plist存取方法

所以此处注意: 这个NSSearchPathForDirectoriesInDomains函数的第三个参数一般都要写为YES.注意这个函数返回的是一个数组,但是在ios系统中的沙盒只有这样的一个文件夹,所以取数组的第0个元素即可.

在mac系统中,有一个能自动找到应用沙盒的根目录的软件simpholder2.app,在测试使用是非常方便,可以下载使用.(需要的话请联系595632239@163.com)

获取应用沙盒tmp目录的方法:

//获取应用沙盒tmp目录 NSString *tmp = NSTemporaryDirectory();

获取应用沙盒caches目录的方法:

1 //获取应用沙盒tmp目录 2  3 NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; 4  5  6 //当然也可以使用最开始上面介绍的字符串拼接方法获得,此处不再赘述

获取应用沙盒preference目录的方法:

通过NSUserDefaults类存取该目录下的设置信息

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

plist文件存取方式

属性列表是一种XML格式的文件,拓展名为plist

如果对象是NSString、NSDictionary、NSArray、NSData、NSNumber等类型,就可以使用writeToFile:atomically:方法直接将对象写到属性列表文件中

我通过一个小的demo来测试这个plist文件 的存取过程.

在storyboard中拖入两个按钮,分别拖线,执行保存和读取的方法:

存储操作:

 1 - (IBAction)save {  2       3     //获取应用沙盒的根目录有两种方法  4 //    //第一种方法:  5 //    //获取当前应用沙盒的根目录  6 //    NSString *homePath = NSHomeDirectory();  7 //    //拼接路径  8 //    NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];  9 // 10 //    //还要指定存储文件的文件名称,仍然使用字符串拼接 11 //    NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 12 //    //NSLog(@"%@",filePath); 13      14     //第二种方法 15     NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 16         //还要指定存储文件的文件名称,仍然使用字符串拼接 17     NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 18     NSLog(@"%@",filePath); 19     //新建一个数组(作为例子) 20     NSArray *array = @[@"abc",@123,@"a-d-g"]; 21      22     //将数组存储到文件中 23     [array writeToFile:filePath atomically:YES]; 24      25  26      27      28 }

读取操作:

 1 - (IBAction)read {  2       3     //获取Documents目录  4     NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];  5     //还要指定存储文件的文件名称,仍然使用字符串拼接  6     NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"];  7       8       9     //使用一个数组来接受数据 10     NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; 11     NSLog(@"%@",array); 12      13 }

我这里是使用NSArray来进行测试存取的,也可以使用字典.但是有一点需要注意,就是存取字符串的时候,最好不要使用plist文件,因为plist本身不支持字符串(这个可以通过新建一个plist文件,打开之后,发现其根节点处,只有数组和字典两个选项),而且字符串的存取方法也已经过期.

此处再顺便 介绍一下上面提到的 能自动找到应用沙盒的根目录的软件simpholder2.app 软件,安装打开之后,

ios开发----应用数据存储的常用方法之plist存取方法

点击之后就会自动打开当前应用的沙盒,非常方便测试使用.

ios开发----应用数据存储的常用方法之plist存取方法

最后附上程序的源代码:

ViewController:

ios开发----应用数据存储的常用方法之plist存取方法
 1 //  2 //  ViewController.m  3 //  02-plist文件存取  4 //  5 //  Created by hukezhu on 15/6/5.  6 //  Copyright (c) 2015年 hukezhu. All rights reserved.  7 //  8   9 #import "ViewController.h" 10  11 @interface ViewController () 12 - (IBAction)save; 13  14 - (IBAction)read; 15 @end 16  17 @implementation ViewController 18  19 - (void)viewDidLoad { 20     [super viewDidLoad]; 21     // Do any additional setup after loading the view, typically from a nib. 22 } 23  24 - (void)didReceiveMemoryWarning { 25     [super didReceiveMemoryWarning]; 26     // Dispose of any resources that can be recreated. 27 } 28  29 //获取应用沙盒的根目录有两种方法 30 //第一种方法: 31  32  33  34 - (IBAction)save { 35      36     //获取应用沙盒的根目录有两种方法 37 //    //第一种方法: 38 //    //获取当前应用沙盒的根目录 39 //    NSString *homePath = NSHomeDirectory(); 40 //    //拼接路径 41 //    NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"]; 42 // 43 //    //还要指定存储文件的文件名称,仍然使用字符串拼接 44 //    NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 45 //    //NSLog(@"%@",filePath); 46      47     //第二种方法 48     NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 49         //还要指定存储文件的文件名称,仍然使用字符串拼接 50     NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 51     NSLog(@"%@",filePath); 52     //新建一个数组(作为例子) 53     NSArray *array = @[@"abc",@123,@"a-d-g"]; 54      55     //将数组存储到文件中 56     [array writeToFile:filePath atomically:YES]; 57      58  59      60      61 } 62  63 - (IBAction)read { 64      65     //获取Documents目录 66     NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0]; 67     //还要指定存储文件的文件名称,仍然使用字符串拼接 68     NSString *filePath = [docPath stringByAppendingPathComponent:@"test.plist"]; 69      70      71     //使用一个数组来接受数据 72     NSArray *array = [NSArray arrayWithContentsOfFile:filePath]; 73     NSLog(@"%@",array); 74      75 } 76 @end
VIewController

本篇文章只是说了一个plist文件的存取,剩下的文件存取方式,之后再介绍.

根据学习,整机整理相关知识点,如有错误不当之处,请批评指正,谢谢.

正文到此结束
Loading...