浅谈APP中常使用的持久化存储方式,仅供初学者学习.
/**
* 写入文件
*/
-(void)saveUserName:(NSString *)username password:(NSString *)password
{
[[NSUserDefaults standardUserDefaults] setObject:username forKey:@"username"];
[[NSUserDefaults standardUserDefaults] setObject:password forKey:@"password"];
[[NSUserDefaults standardUserDefaults] synchronize];
//在使用的时候,就可以读出来使用
NSString * userName = [[NSUserDefaults standardUserDefaults] objectForKey:@"username"];
NSString * passWord = [[NSUserDefaults standardUserDefaults] objectForKey:@"password"];
NSLog(@"%@ %@",userName,passWord);
//NSUserDefaults 支持的数据类型有:NSNumber(NSInteger,float,double),NSString,NSDate,NSArray,NSDictionary,BOOL
}
-(void)savePlist
{
//数据存储,是保存到手机里面
//Plist存储,就是把某些数据写到plist文件中
//Plist存储一般用来存储数组和字典
//Plist存储是苹果特有,只有苹果才能生成Plist
//Plist不能存储自定义对象,如NSObjcet,model
NSDictionary * dict = @{@"age":@"18",@"name":@"jack"};
//保存应用沙盒(app安装到手机的文件夹)
//Caches文件夹
//在某个范围内容搜索文件夹的路径
//directory:获取哪个文件夹
//domainMask:在哪个范围下获取,NSUserDomainMask:在用户的范围内搜索
//expandTilde 是否展开全路径,YES:展开
NSString * cachePath = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0];
NSLog(@"%@",cachePath);
//拼接文件路径
NSString * filePath = [cachePath stringByAppendingPathComponent:@"data.plist"];
//获取应用沙盒
NSString * homePath = NSHomeDirectory();
NSLog(@"%@",homePath);
//File:文件全路径 => 所有文件夹路径 + 文件路径
[dict writeToFile:filePath atomically:YES];
//将数据取出来
NSLog(@"%@",[NSDictionary dictionaryWithContentsOfFile:filePath]);
}
/**
* 归档(NSKeyedArchiver)
*/
-(void)NSKeyedArchiver
{
// 自定义对象应用范围很广,因为它对应着MVC中的Model层,即实体类。在程序中,我们会在Model层定义很多的entity,例如User、Teacher、Person等。
//
// 那么对自定义对象的归档显得重要的多,因为很多情况下我们需要在Home键之后保存数据,在程序恢复时重新加载,那么,归档便是一个好的选择。
//
// 下面我们自定义一个Person类:
// 要使对象可以归档,必须遵守NSCoding协议
// @interface Person : NSObject<NSCoding>
//
// @property (nonatomic, assign) int age;
// @property (nonatomic, strong) NSString *name;
//
// @end
//
// @implementation Person
//
// // 什么时候调用:只要一个自定义对象归档的时候就会调用
// - (void)encodeWithCoder:(NSCoder *)aCoder {
// [aCoder encodeObject:self.name forKey:@"name"];
// [aCoder encodeInt:self.age forKey:@"age"];
// }
//
// - (id)initWithCoder:(NSCoder *)aDecoder {
// if (self = [super init]) {
// self.name = [aDecoder decodeObjectForKey:@"name"];
// self.age = [aDecoder decodeIntForKey:@"age"];
// }
// return self;
// }
// @end
// 如何将自定义对象归档和解档:
//
// - (void)savePerson {
// // 归档:plist存储不能存储自定义对象,此时可以使用归档来完成
// Person *person = [[Person alloc] init];
// person.age = 18;
// person.name = @"USER";
//
// // 获取tmp目录路径
// NSString *tempPath = NSTemporaryDirectory();
//
// // 拼接文件名
// NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
//
// // 归档
// [NSKeyedArchiver archiveRootObject:person toFile:filePath];
// }
//
// - (void)readPerson {
// // 获取tmp
// NSString *tempPath = NSTemporaryDirectory();
//
// // 拼接文件名
// NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
//
// // 解档
// Person *p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
// NSLog(@"%@ %d",p.name,p.age);
// }
// 假设我们定义了一个自定义的view,这个view是用xib或者storybard来生成的,那么我们我一定如下方法时,就需要如下实现:
//
// @implementation CustomView
//
// // 解析xib,storyboard文件时会调用
// - (id)initWithCoder:(NSCoder *)aDecoder {
// // 什么时候调用[super initWithCoder:aDecoder]?
// // 只要父类遵守了NSCoding协议,就调用[super initWithCoder:aDecoder]
// if (self = [super initWithCoder:aDecoder]) {
// NSLog(@"%s",__func__);
// }
//
// return self;
// }
//
// @end
}
/**
* 如何将自定义对象归档和解档
*/
-(void)savePerson
{
//归档:plist 存储不能存储自定义对象,此时可以使用归档来完成
Person * person = [[Person alloc] init];
person.age = 18;
person.name = @"jack";
//获取tmp目录路径
NSString * tempPath = NSTemporaryDirectory();
//拼接文件名
NSString * filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
//归档
[NSKeyedArchiver archiveRootObject:person toFile:filePath];
}
-(void)readPerson
{
//获取tmp
NSString * tempPath = NSTemporaryDirectory();
//拼接文件名
NSString *filePath = [tempPath stringByAppendingPathComponent:@"person.data"];
//解档
Person * p = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
NSLog(@"%@ %d",p.name,p.age);
}