ios开发中数据的存储方式有:
* plist存储
*偏好设置
*归档
*SQLite数据库
*core Data
1> plist存储
(1) 存储数据
// plist其实就是存储字典或者数组对象
NSArray *arr = @[@1,@3,@"123"];
// 获取应用沙盒
// NSString *homePath = NSHomeDirectory();
// 获取Caches
// directory:搜索哪个文件夹
// domainMask:在哪个范围内搜索,在用户的范围下 NSUserDomainMask
// expandTilde:是否展开全路径,YES
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 拼接文件名arr.plist
NSString *filePath = [cachePath stringByAppendingPathComponent:@"arr.plist"];
// 存储数据
// File:文件全路径
[arr writeToFile:filePath atomically:YES];
// 读取数据
NSString *cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
// 拼接文件名arr.plist
NSString *filePath = [cachePath stringByAppendingPathComponent:@"arr.plist"];
// 用什么对象存储就用什么对象读取
NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
2 >偏好设置存储
* 偏好设置存储的本质也是一种plist存储方式,它主要用来存储一些键值对(1)数据的存储
/ NSUserDefaults:用来做偏好设置存储
// NSUserDefaults使用方式跟字典
// account:xmg age 18
// 偏好设置:如果想要快速进行键值对存储
// 好处:不需要关心文件名
[[NSUserDefaults standardUserDefaults] setObject:@"xmg" forKey:@"account"];
[[NSUserDefaults standardUserDefaults] setInteger:18 forKey:@"age"];
[[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"isOn"];
NSString *account = [[NSUserDefaults standardUserDefaults] objectForKey:@"account"];
NSInteger age = [[NSUserDefaults standardUserDefaults] integerForKey:@"age"];
// 归档:自定义对象使用归档,不能使用plist存储
Person *p = [[Person alloc] init];
p.name = @"xmg";
p.age = 18;
// temp
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// 归档
[NSKeyedArchiver archiveRootObject:p toFile:filePath];
// temp
NSString *tempPath = NSTemporaryDirectory();
// 拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
// 解档
Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
(3)需要归档的自定义对象中必须遵守NSCoding协议,并且必须实现里面的归档和接档的两个方法// 什么时候调用:自定义对象归档的时候就会调用
// 作用:告诉系统当前对象哪些属性需要归档
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeInt:_age forKey:@"age"];
}
// 什么时候调用:自定义对象解档的时候就会调用
// 作用:告诉系统当前对象哪些属性需要解档
// initWithCoder:解析文件
// initWithCoder方法调用:只要对象是通过解析文件创建的就会调用
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{
// super initWithCoder
if (self = [super init]) {
// 注意:一定要记住需要给成员属性赋值
_name = [aDecoder decodeObjectForKey:@"name"];
_age = [aDecoder decodeIntForKey:@"age"];
}
return self;
}