在iOS开发中,需要把用户的数据存储起来,便于下次使用,就需要用到数据存储方法.
1.plist存储
好处:可以手动管理存储路径,避免系统删除.
缺点:存取都比较繁琐,不能存储对象.
存:
//创建数据
NSArray *arr = @[@123,@"dl"];
//获取存储路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//给路径加上扩展名
path = [path stringByAppendingPathComponent:@"arr.pilst"];
//写入路径
[arr writeToFile:path atomically:YES];
取:
//获取存储路径
NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
//给路径加上扩展名
path = [path stringByAppendingPathComponent:@"arr.pilst"];
//读取文件
[NSArray arrayWithContentsOfFile:path];
2.偏好设置存储
好处:不需要关心存储路径.
缺点:系统管理,程序猿无法手动管理,不能存储对象
存:
//获取系统对象
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
//存储数据
[defaults setObject:name forKey:@"name"];
** 取:**
//定义属性接收读取的内容
NSString *name = [[NSUserDefaults standardUserDefaults] objectForKey:@"name"];
3.自定义对象存储
好处:可以存储任意内容,且手动管理路径.
缺点:需要实现很多方法,比较繁琐.
存:
1.在点击存储时将数组数据归档存储:
//使用自定义归档实现通讯录内容数据的存储
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
AddViewController *vc = segue.destinationViewController;
vc.block = ^(DLContact *contact){
[_contacts addObject:contact];
//获取路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contact.data"];
NSLog(@"%@",path);
//归档内容
[NSKeyedArchiver archiveRootObject:_contacts toFile:path];
[self.tableView reloadData];
};
}
2.在模型类中重写encodeWithCoder:和initWithCoder:方法给需要归档和解档的模型属性设置归档和接档
存取方法实现:
//归档成员属性并设置其对应的key
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:_name forKey:@"name"];
[aCoder encodeObject:_phone forKey:@"phone"];
}
//根据key解档数据并赋值给成员变量
- (instancetype)initWithCoder:(NSCoder *)aDecoder
{//需先初始化父类
if (self = [super init]) {
_name = [aDecoder decodeObjectForKey:@"name"];
_phone = [aDecoder decodeObjectForKey:@"phone"];
}
return self;
}
3.在数组懒加载方法中读取解档后的数据
取:
- (NSMutableArray *)contacts{
//如果没有值
if (_contacts == nil) {
//获取存储的路径
NSString *path = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0] stringByAppendingPathComponent:@"contact.data"];
//给数组赋值
_contacts = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
//如果解档后无数据
if (_contacts == nil) {
//新建数组准备存值
_contacts = [NSMutableArray array];
}
}
return _contacts;
}
注意:如果对模型属性进行了编辑,需再次存档之后才能读取到新的模型数据!
Tips:可将存档方法定义为block代码块方便及时调用.