整理印象笔记之 关于iOS应用数据存储的常用方式
- XML属性列表(plist)归档
- NSUserDefaults(偏好设置)
- NSKeyedArchiver归档(NSCoding)
- Core Data
- SQLite3
应用沙盒
每个iOS的APP都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离,应用必须待在自己的沙盒里,其他应用是访问不了该沙盒
应用沙盒的文件系统目录,
应用程序包:
Documents:保存应用运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录
tmp:保存应用运行时所需要的临时数据,使用完毕后再将相应的文件从该目录删除,应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录
Library/Canches:保存应用运行时 生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的数据
Library/Preference:保存应用的所有偏好设置,iOS的Setting应用会在该目录中查找应用的设备信息。iTunes同步设备时会备份该目录
Plist:保存数组和字典
//获取应用沙盒
NSString * homePath = NSHomeDirectory();
//获取temp
NSString * temp = NSTemporaryDirectory();
//获取Cache
//NSSearchPathDirectory:搜索的目录
//NSSearchPathDomainMask:搜索范围
//expandTilde:是否展开全路径,如果没有展开,应用的沙盒路径就是~
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask,YES)[0];
NSString *filePath = [path stringByAppendingString:@"arr.plist"];
关于存取
NSDictionary *dic = @{@"key":@"vlaue",@"name":@"xiaoming"};
//存
[dic writeToFile:filePath atomically:YES];
//取
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSArray *arr = @[@"1",@"2"];
//存
[arr writeToFile:filePath atomically:YES];
//取
NSArray *array = [NSArray arrayWithContentsOfFile:filePath];
NSUserDefaults(可以是任何对象类)
存储位置(Preferences)
具体实现:
//存:
NSUserDefaults *suerdefaults = [NSUserDefaults standardUserDefaults];
[suerdefaults setValue:@"value" forKey:@"key"];
//iOS7之前,需要加上这句,默认不会马上和硬盘同步
[userDefaults synchronize];
//取:
NSString *str = [userDefaults valueForKey:@"key"];
NSKeyedArchiver归档
一个自定义对象想要归档,必须遵守NSCoding协议
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory,NSUserDomainMask, YES)[0];
NSString *filePath = [path stringByAppendingString:@"Student.data"];
Student *stu = [[Student alloc]init];
stu.name = @"name";
stu.age = 12;
//归档
//如果是数组,底层会遍历数组元素,一个一个的归档,
//如果是对象,就直接归档
[NSKeyedArchiver archiveRootObject:stu toFile:filePath];
//解档
Student *stu1 = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@---%ld",stu1.name,(long)stu1.age);
#import "Student.h"
//一个自定义对象想要归档,必须遵守NSCoding协议
@interface Student()<NSCoding>
@end
@implementation Student
//描述当前对象里有哪些属性需要归档
- (void)encodeWithCoder:(nonnull NSCoder *)aCoder {
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInteger:_age forKey:@"age"];
}
//描述当前对象里有哪些属性需要解档
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [aDecoder decodeIntegerForKey:@"age"];
}
return self;
}