iOS本地数据存储有哪几种方式?
1. 复杂对象写入本地NSKeyedArchiver(归档)采用归档的形式来保存数据,该对象数据需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法。
现在创建一个Boss类,并且.h遵守NSCoding协议,.m两个协议方法。
Boss.h文件
#import <Foundation/Foundation.h>
// NSCoding 协议 把一个类中的所有数据, 进行整体编码 方便进行文件读取
@interface Boss : NSObject <NSCoding>
@property (nonatomic, retain)NSString *name;
@property (nonatomic, retain)NSString *sex;
@property (nonatomic, retain)NSString *number;
@end
#import "Boss.h"
@implementation Boss
- (void)dealloc
{
[_name release];
[_sex release];
[_number release];
[super dealloc];
}
// 协议方法1 编码方法
- (void)encodeWithCoder:(NSCoder *)aCoder
{
// 对每个属性标记, 用于在读取数据时进行恢复
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.sex forKey:@"sex"];
[aCoder encodeObject:self.number forKey:@"number"];
}
// 协议方法2 解码方法
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
// 每次都按照之前给定的key 给对应属性赋值
self.name = [aDecoder decodeObjectForKey:@"name"];
self.sex = [aDecoder decodeObjectForKey:@"sex"];
self.number = [aDecoder decodeObjectForKey:@"number"];
}
return self;
}
@end
2.Write写入方式:永久保存在磁盘中
//沙盒的含义 在一定范围内可以做任何事情;
//iOS的沙盒指的就是应用程序的文件操作文件夹,在文件夹内可以读写任何内容,但是完全不能访问其他应用程序的沙盒文件夹;
//Document:用户相关的文件,用户数据,用户设置的对应用程序的偏好设置,用户的一些文本信息,最好不要存储占空间较大的文件比如视频音频
// Library : 给开发者使用的
// Caches :存储缓存文件, 用户看过的图片音频视频缓存 一般的app清除缓存就是清除这个文件夹中的内容
//preferen : 给开发者存储一些内容, NSUserDefaults 保存的信息都在这个文件中
// tmp : 临时文件夹, 存储网络请求过程中的临时文件. 在app版本更新时会直接清空tmp文件
//简单对象写入本地 NSString,NSArray NSNumber NSData NSDictionary等;//打印沙盒文件路径
NSLog(@"%@", NSHomeDirectory());
// 1. 拼接一个存储路径
// 系统提供了一个函数 直接返回某一个沙盒文件夹的路径
// 返回值: 找到的路径组成的数组, 如果搜索的是系统的沙盒文件 那么数组中只有一个元素
// 参数1: 搜索沙盒中的哪个文件夹
// 参数2: 在什么范围内搜索
// 参数3: 返回的是相对路径 or 绝对路径
NSArray *arr = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 获取文件路径
// 取出Document文件夹的路径
NSString *docPath = [arr lastObject];
// 在Document文件路径后 拼接一个文件路径
NSString *textPath = [docPath stringByAppendingString:@"/123.text"];
// 2. 按照路径写入
NSString *str = @"张强去WC, 把网断了, 这是个秘密";
// 系统提供了存储字符串的方法
// 返回值: BOOL
// 参数1: 要写入的路径
// 参数2: 是否对写入的文件进行写保护
// 参数3: 编码方式
// 参数4: 错误信息
NSError *error = nil;
[str writeToFile:textPath atomically:YES encoding:NSUTF8StringEncoding error:&error];
// 读取信息
NSString *readStr = [[NSString alloc] initWithContentsOfFile:textPath encoding:NSUTF8StringEncoding error:nil];
NSLog(@"%@", readStr);
// 数组写入本地
NSArray *array = [NSArray arrayWithObjects:@"111", @"222", @"333", @"444", nil];
// 拼接路径
NSString *arrPath = [docPath stringByAppendingPathComponent:@"arr.plist"];
// 写入本地
[array writeToFile:arrPath atomically:YES];
NSArray *myArr = [[NSArray alloc] initWithContentsOfFile:arrPath];
for (NSString *str in myArr) {
NSLog(@"---------%@", str);
}
3.NSUserDefaults:用来保存应用程序设置和属性、用户保存的数据。用户再次打开程序或开机后这些数据仍然存在。NSUserDefaults可以存储的数据类型包括:NSData、NSString、NSNumber、NSDate、NSArray、NSDictionary。