在实际项目开放中数据持久化是程序核心结构之一,适当的对数据进行持久化存储可以实现应用的离线功能,以此提高用户体验。常见的数据持久化有:
* preference(偏好设置)
* NSKeyedArchiver(归档)
* plist文件(属性列表)
* SQLite 3
* CoreData
本篇文章主介绍数据持久化中的plist文件的增删查改,其他数据方法会在后面的文章中体现。
沙盒
在介绍各种存储方法之前,先说明下沙盒机制。每个ios应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒中。打开Finder窗口,点击“前往”,然后按住option键进入“资源库”文件夹中,向下找到Developer/CoreSimulator/Devices这些子目录对应的是每个模拟器,进入子目录中进入Containers/Data/Application 然后任意打开一个子目录会看到应用沙盒文件系统目录
沙盒的目录结构如下:
Documents
Library
Caches
Preferences
tmp
Documents:最常用的目录,可以将应用程序数据储存在Document目录中,如果应用启用了Itunes文件分享功能,Itunes同步设备时会备份该目录,例如游戏存档,适合存储重要数据。
//获取Document路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).firstObject;
//其中NSDocumentDirectory 我们要找的Documents目录,NSUserDomainMask从用户文件夹下找,YES/NO 是否获取全路径一般YES ,数组中firstObject处必定是Document目录
Library/Caches: 保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录,一般储存体积大,不需要备份的数据
NSString *cachePath = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"cachePath = %@",cachePath);
Library/Preferences: iTunes同步该应用时会同步此文件夹中的内容,通常保存应用的设置信息。
NSString *prePath = [NSSearchPathForDirectoriesInDomains(NSPreferencePanesDirectory, NSUserDomainMask, YES) lastObject];
NSLog(@"prePath = %@",prePath);
tmp: 供应用储存临时文件,使用完毕后再将相应的文件从该目录删除,当ios设备同步时不会备份这个文件。
NSString *path = NSTemporaryDirectory();
NSLog(@"%@", path);
plist只能存储系统自带的一些常规的类, 也就是有writeToFile方法的对象才可以使用plist保存数据
可储存的数据有:
1. NSArray;
2. NSMutableArray;
3. NSDictionary;
4. NSMutableDictionary;
5. NSData;
6. NSMutableData;
7. NSString;
8. NSMutableString;
9. NSNumber;
10. NSDate;
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
//拼接文件路径
NSString *plistPath = [path stringByAppendingPathComponent:@"person.plist"];
//存入数据
NSDictionary *dic = @{@"name":@"张三",@"age":@(20)};
[dic writeToFile:plistPath atomically:YES];
//读取数据
NSMutableDictionary *dic1 = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
NSLog(@"dic1 = %@",dic1);
//增加数据
[dic1 setObject:@"男" forKey:@"sex"];
[dic1 writeToFile:plistPath atomically:YES];
//修改数据
NSMutableDictionary *dic2 = [NSMutableDictionary dictionaryWithContentsOfFile:plistPath];
NSLog(@"dic2 = %@",dic2);
注意
只有以上列出的类型才能使用plist文件存储。
存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。
读取时使用dictionaryWithContentsOfFile:方法。
读取本地的plist文件
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"PropertyDemo" ofType:@"plist"];
NSMutableDictionary *userInfo = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
NSLog(@"plist文件中得内容%@",userInfo);