一、数据存储的几种方式
- NSUserDefaults
- Plist文件
- 解归档
- 沙盒
- SQLite
- CoreData
1.NSUserDefaults
- 适用:适用于数据量小的,比如一些基本的用户设置。
- 存储类型:NSArray、NSDictionary、NSData、OC基本类型属性
- 不可存储:不可直接存储自定义的对象(自定义的需要进行归档再存储)
- 使用方法:
// 1.创建数组
NSMutableArray *arr = [[NSMutableArray alloc] initWithObjects:@"1", nil];
// 2.存入NSUserDefaults
[[NSUserDefaults standardUserDefaults] setObject:arr forKey:@"ArrKey"];
// 3.同步
[[NSUserDefaults standardUserDefaults] synchronize];
// 4.读取NSUserDefaults的数据
NSArray *arr = [[NSUserDefaults standardUserDefaults] objectForKey:@"ArrKey"];
2.Plist文件-Property List(是Xcode的一种资源包,同样是一种存储工具)
- 优缺点:优点是可视化很直观的看到文件内容而且便于直接操作文件,缺点是因为其一般作用于固态的数据形式保存而经常变动的数据不好操作了
- 适用:适用于固态的数据存储
- 存储类型:NSArray、NSDictionary、NSData、Boolean、NSDate、NSNumber、NSString
- 不可存储:不可直接存储自定义的对象(自定义的需要进行归档再存储)
- 使用方法:
方法1:
// 1.创建Property List文件
// 2.设置对应的值
// 3.获取文件中的数据
NSString *str = [[NSBundle mainBundle] pathForResource:@"testPlistFile" ofType:@"plist"];
// 4.获取内容
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:str];
方法2:
// 1.获取用户主目录
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// 2. 取出路径
NSString *plistPath = [paths objectAtIndex:0];
// 3.新建Plist文件路径
NSString *fileName = [plistPath stringByAppendingPathComponent:@"testPlist.plist"];
// 4.创建Plist文件
NSFileManager *fm = [NSFileManager defaultManager];
[fm createFileAtPath:fileName contents:nil attributes:nil];
// 5.创建数据
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:@"test", nil];
// 6.存入Plist文件
[dict writeToFile:fileName atomically:YES];
// 7.读取Plist文件
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:fileName];
3.解归档
- 优缺点:优点是解决了不能将自定义对象存储到NSUserDefault或Plist文件,解归档针对的就是一个对象
- 适用:
- 存储类型:NSArray、NSDictionary、NSData、Boolean、NSDate、NSNumber、NSString
- 不可存储:
- 使用方法:
// 1.首先我们拥有一个自定义对象XHModel,要遵循NSCoding协议并实现协议方法
#import <Foundation/Foundation.h>
@interface XHModel:NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, assign) NSInteger age;
@end
#import "XHModel.h"
@implementation XHModel
- (id)initWithCode:(NSCode *)aDecoder
{
if (self = [super init]) {
self.name = [aDecoder decodeObjectForKey:@"name"];
self.age = [[aDecoder decodeObjectForKey:@"age"] integerValue];
}
return self;
}
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:@"age"];
}
- (NSString *)description
{
return [NSString stringWithFormat:@"%@--%ld岁", self.name, (long)self.age];
}
// 2.外部创建模型
XHModel *model = [[XHModel alloc] init];
model.name = @"小黄";
model.age = 18;
// 3.创建NSData
NSMutableData *data = [[NSMutableData alloc] init];
// 4.创建归档辅助类
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
// 5.编码
[archiver encodeObject:model forKey:@"model"];
[archiver finishEncoding];
// 6.写入到沙盒
NSArray *array = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *fileName = [array.firstObject stringByAppendingPathComponent:@"archiverModel"];
if([data writeToFile:fileName atomically:YES]){
NSLog(@"归档成功");
}
//解档
NSData *undata = [[NSData alloc] initWithContentsOfFile:fileName];
//解档辅助类
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:undata];
//解码并解档出model
TestModel *unModel = [unarchiver decodeObjectForKey:@"model"];
NSLog(@"%@",unModel);
//关闭解档
[unarchiver finishDecoding];
4.存放沙盒
- Documents目录:存放应用程序所有数据文件,该目录用于仓储用户数据或者其他应该定期备份的信息,为了不让App备份过于庞大,不建议存放大容量文件
- App目录:
- Library目录:
- Tmp目录:
- 优缺点:优点是
- 适用:
- 存储类型:NSArray、NSDictionary、NSData、Boolean、NSDate、NSNumber、NSString
- 不可存储:
- 使用方法:
######5.NSUserDefaults
######6.NSUserDefaults