iOS UI16_數據持久化
阿新 • • 發佈:2017-06-27
spl 什麽 手機 function 定義 lin rip clas sin
//
// Student.h
// UI16_數據持久化
//
// Created by dllo on 15/8/19.
// Copyright (c) 2015年 zhozhicheng. All rights reserved.
//
#import <Foundation/Foundation.h>
#pragma mark 假設想實現歸檔和反歸檔的操作須要先簽訂一個協議NSCoding
@interface Student : NSObject<NSCoding>
@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];
}
@end
iOS UI16_數據持久化