//
// Student.h
// UI16_數據持久化
//
// Created by dllo on 15/8/19.
// Copyright (c) 2015年 zhozhicheng. All rights reserved.
//
#import
#pragma mark 如果想實現歸檔和反歸檔的操作需要先簽訂一個協議NSCoding
@interface Student : NSObject
@property(nonatomic,copy)NSString *name;
@property(nonatomic,copy)NSString *sex;
@property(nonatomic,assign)NSInteger age;
@property(nonatomic,copy)NSString *hobby;
//針對這四條屬性,寫一個自定義初始化方法和便利構造器
-(instancetype)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
hobby:(NSString *)hobby;
+(instancetype)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
hobby:(NSString *)hobby;
@end
//
// Student.m
// UI16_數據持久化
//
// Created by dllo on 15/8/19.
// Copyright (c) 2015年 zhozhicheng. All rights reserved.
//
#import Student.h
@implementation Student
-(instancetype)initWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
hobby:(NSString *)hobby
{
self=[super init];
if (self) {
_age =age;
_name =name;
_hobby =hobby;
_sex =sex;
}
return self;
}
+(instancetype)studentWithName:(NSString *)name
sex:(NSString *)sex
age:(NSInteger)age
hobby:(NSString *)hobby
{
Student *stu = [[Student alloc] initWithName:name sex:sex age:age hobby:hobby];
return stu;
}
#pragma mark 簽訂完NSCoding協議之後,需要實現兩個協議方法,一個是歸檔的時候使用的,一個是反歸檔的時候使用的
- (void)encodeWithCoder:(NSCoder *)aCoder
{
[aCoder encodeObject:self.name forKey:@姓名];
[aCoder encodeInteger:self.age forKey:@年齡];
[aCoder encodeObject:self.hobby forKey:@愛好];
[aCoder encodeObject:self.sex forKey:@性別];
//使用encode方法要和數據的類型相互匹配
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
if (self) {
//把數據根據之前的key再反編譯回來
self.name = [aDecoder decodeObjectForKey:@姓名];
self.age = [aDecoder decodeIntegerForKey:@年齡];
self.hobby = [aDecoder decodeObjectForKey:@愛好];
self.sex = [aDecoder decodeObjectForKey:@性別];
}
return self;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
//
// ViewController.m
// UI16_數據持久化
//
// Created by dllo on 15/8/19.
// Copyright (c) 2015年 zhozhicheng. All rights reserved.
//
#import ViewController.h
#import Student.h
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
//蘋果手機為了保證自己數據上的絕對安全,設計了沙盒文件,每一個應用程序上都配備了自己的沙盒文件,每一次運行,文件夾的名字就會變成一個沒有任何規律的字符串
//第一個參數:當前要前往那一個文件夾,前往documents文件用NSDocuemtDirectory,64行那個,還可以前往caches文件夾,對應68行
//第二個參數:訪問的文件夾類型,指定訪問是用戶文件夾
//第三個參數:絕對路徑(YES),相對路徑(NO)
//絕對路徑是給系統使用的,系統可以根據當前的路徑找到文件夾,我們在操作文件夾時是絕對路徑
//相對路徑只會把要前往的文件夾顯示,其他部分都是~,告訴程序員要去哪個文件夾
// NSArray *sandbox =NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);
// NSLog(@%@,sandbox[0]);
//沙盒裡一共有三個文件
//1.是Documents文件:主要用來存儲用戶的想要存儲的一些信息,比如收藏的信息或者自己設置的一些內容,所以我們做收藏功能就是前往這個文件夾裡寫文件
//2.Library文件夾裡是方便程序開發者的,主要操作它裡面的兩個文件夾,caches和Preferences
//caches:用來保存緩存文件,SDWebImage會把圖片加到緩存文件中,所以清除緩存功能就是把這個文件夾刪除
//Preferences:一般來保存程序員設置的信息,比如NSUserDefults就會把數據保存在這個文件夾裡
//3.tmp文件:一般存放臨時內容
//之前在沙盒裡還有一個.app文件,在新的版本裡已經被移走了
//把簡單對象寫入到本地,簡單對象指的是NSString,NSArray
// //1.先通過數組獲取沙盒路徑
// NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// //從數組裡獲取沙盒路徑
// NSString *sandBoxPath =sandbox[0];
// //要給寫入的文件拼接一個路徑,拼接方式有兩種
//// NSString *documentPath = [sandBoxPath stringByAppendingString:@/顧宇.txt];
//
// NSString *documentPath = [sandBoxPath stringByAppendingPathComponent:@顧宇.xml];
// NSLog(@%@,documentPath);
// NSString *str = @書山有路勤為徑,學海無涯苦作舟;
// //把字符串寫入到本地
// //第一個參數:文件要保存的路徑
// //第二個參數:對文件進行保護YES
// //第三個參數:編碼
// //第四個參數,錯誤信息
// [str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
// //如果路徑下有對應的文件,則會把原來文件覆蓋,如果沒有則創建一個新文件
// //把沙盒文件讀出來
// NSString *temoStr = [NSString stringWithContentsOfFile:documentPath encoding:NSUTF8StringEncoding error:nil];
// NSLog(@%@,temoStr);
// //把數組寫入到本地
// NSArray *arr =@[@1,@2,@3,@4,@5,@6];
// //通過數組獲取沙盒地址
// NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// //用字符串保存沙盒路徑
// NSString *sandboxPath = sandbox[0];
// //給要寫入的文件拼接路徑
// NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@哈哈.plist];
// //把數組寫入到本地
// [arr writeToFile:documentPath atomically:YES];
// NSLog(@%@,documentPath);
//
// //把數組讀出來
// NSArray *temp = [NSArray arrayWithContentsOfFile:documentPath];
// NSLog(@%@,temp);
// //把字典寫入到本地
// NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:@1,@2, nil];
// NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// NSString *sandboxPath = sandbox[0];
// NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@嘿嘿];
// [dic writeToFile:documentPath atomically:YES];
// NSLog(@%@,documentPath);
//
// NSDictionary *temp = [NSDictionary dictionaryWithContentsOfFile:documentPath];
// NSLog(@%@,temp);
//復雜對象寫入到本地,主要指我們自己創建的對象寫入到本地,也叫歸檔和犯反歸檔操作
//創建對象呢
// Student *stu1 = [Student studentWithName:@張三 sex:@男 age:14 hobby:@玩];
// //1.通過數組獲取沙盒路徑
// NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
// //2.用字符串截取沙盒路徑
// NSString *sandBoxPath = sandbox[0];
// //3.拼接文件夾路徑,這個文件夾擴展名是任意的
// NSString *decomentPath = [sandBoxPath stringByAppendingPathComponent:@學生.avi];
// //對對象進行歸檔操作
// //第一個參數:要實施歸檔的對象
// //第二個參數:路徑
// [NSKeyedArchiver archiveRootObject:stu1 toFile:decomentPath];
// NSLog(@%@,decomentPath);
//
// //反歸檔
// Student *newStu = [NSKeyedUnarchiver unarchiveObjectWithFile:decomentPath];
// NSLog(@%@,newStu.name);
// //創建三個學生
// Student *stu1 = [Student studentWithName:@張三 sex:@男 age:14 hobby:@玩];
// Student *stu2 = [Student studentWithName:@李四 sex:@女 age:15 hobby:@睡覺];
// Student *stu3 = [Student studentWithName:@神六 sex:@男 age:16 hobby:@唱歌];
// NSArray *array = @[stu1,stu2,stu3];
//
// NSArray *sandbox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
// NSString *sandboxPath = sandbox[0];
// //拼接文件路徑
// NSString *documentPath = [sandboxPath stringByAppendingPathComponent:@曹軍.plist];
// //歸檔操作
// [NSKeyedArchiver archiveRootObject:array toFile:documentPath];
// NSLog(@%@,documentPath);
//
// //反歸檔,遍歷學生姓名
// NSArray *arr = [NSKeyedUnarchiver unarchiveObjectWithFile:documentPath];
// for (Student *temp in arr) {
// NSLog(@%@,temp.name);
// }
#warning 總結:數據持久化的步驟
//1.指定前往那一個文件夾
//2.用字符串接收路徑
//3.拼接文件路徑
//4.寫入本地或歸檔操作
//注;如果是復雜對象歸檔,要簽訂NSCoding協議,並且實現兩個協議方法,放在數組裡的復雜對象歸檔也要簽協議
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setObject:@123456 forKey:@password];
// NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
// NSLog(@%@,sandBox[0]);
// NSLog(@%@,[defaults objectForKey:@password]);
//NSUserDefaults一般存放的是小的數據,比如字符串等,它的用法和字典類似
//通過文件管理者對文件夾進行操作
NSArray *sandBox = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, 1, YES);
NSString *sandBoxPath =sandBox[0];
//創建一個文件管理者
NSFileManager *manager = [NSFileManager defaultManager];
//給要創建的文件夾拼接一個路徑
NSString *filePath = [sandBoxPath stringByAppendingPathComponent:@guyu];
//文件夾的名不需要擴展名
//通過manager進行文件夾的創建
[manager createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:nil];
NSLog(@%@,filePath);
//向文件夾裡寫入一個字符串
NSString *documentPath = [filePath stringByAppendingPathComponent:@字符串.txt];
NSString *str = @我是字符串;
[str writeToFile:documentPath atomically:YES encoding:NSUTF8StringEncoding error:nil];
//移除文件夾
// [manager removeItemAtPath:filePath error:nil];
//
//清除緩存
NSArray *cache = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, 1, YES);
NSString *cachePath =cache[0];
[manager removeItemAtPath:cachePath error:nil];
}