
[注意]转载时请注明出处博客园-吃唐僧肉的小悟空http://www.cnblogs.com/hukezhu/
ios应用数据存储的常用方式主要有:
介绍这些方法之前,首先介绍一下应用沙盒的概念.
ios应用沙盒机制就是指ios应用程序只能在为该程序创建的文件系统中读取文件,不可以去其它地方访问,此区域被成为沙盒,所以所有的非代码文件都要保存在此,例如图像,图标,声音,映像,属性列表,文本文件等。(ios8之前是这个样子,iOS8新开放了一种对几个固定系统区域的扩展机制extension,它可以在一定程度上弥补iOS的沙盒机制对应用间通信的限制).
应用沙盒机制下,每个应用程序都有自己的存储空间 ;应用程序不能翻过自己的围墙去访问别的存储空间的内容 ;应用程序请求的数据都要通过权限检测,假如不符合条件的话,不会被放行。
应用沙盒的结构主要如下:

Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp:保存应用运行时所需的临时数据,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录 Library/Caches:保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据 Library/Preference:保存应用的所有偏好设置,iOS的Settings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
//获取应用沙盒的根目录 NSString *home = NSHomeDirectory(); //NSHomeDirectory()是一个c语言的方法
获取Documents文件路径的方法:
1 //第一种方法: 2 //获取当前应用沙盒的根目录 3 NSString *homePath = NSHomeDirectory(); 4 //拼接路径 5 NSString *docPath = [homePath stringByAppendingPathComponent:@"Documents"];
//第二种方法
NSString *docPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
这个NSSearchPathForDirectoriesInDomains函数一共有三个参数(注意返回的是一个数组),第一个参数是代表获取什么文件的路径(枚举选择就可),系统已经帮我们封装好.第二个参数代表从用户文件夹下找,第三个参数代表查找时文件是否展开,这个参数一般就填为yes,否则的话可能找不到路径,通过no,获取的路径,系统会将前面的路径换为一个~,如下图:

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

所以此处注意:这个NSSearchPathForDirectoriesInDomains函数的第三个参数一般都要写为YES.注意这个函数返回的是一个数组,但是在ios系统中的沙盒只有这样的一个文件夹,所以取数组的第0个元素即可.
在mac系统中,有一个能自动找到应用沙盒的根目录的软件simpholder2.app,在测试使用是非常方便,可以下载使用.(需要的话请联系[email protected])
获取应用沙盒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];
属性列表是一种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软件,安装打开之后,

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

最后附上程序的源代码:
ViewController:
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文件的存取,剩下的文件存取方式,之后再介绍.
根据学习,整机整理相关知识点,如有错误不当之处,请批评指正,谢谢.
转载:http://www.cocoachina.com/ios/20150720/12610.html