#數據持久化 ##一、文件管理 ###1.1iOS沙盒機制:
iOS應⽤用程序只能在爲該改程序建立的文件系統中讀取文件,不能夠去其它地方訪問,此區域被成爲沙盒,因此全部的非代碼⽂件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件 等。
• 每一個應⽤程序都有⾃己的存儲空間
• 應⽤程序不能翻過自⼰的圍牆去訪問別的存儲空間的內容
• 應用程序請求的數據都要經過權限檢測,假如不符合條件的話,不會被放行。git
經過這張圖只能從表層上理解sandbox是一種安全體系,應⽤程序的全部操做都要經過這個體系來執行,其中核心內容是:sandbox對應⽤程序執行各類操做的權限限制。github
// 沙盒目錄路徑 NSString *homePath = NSHomeDirectory(); // Documents 目錄 NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];
###1.2目錄結構: 默認狀況下,每一個沙盒含有3個⽂件夾:Documents, Library 和 tmp。由於應⽤用的沙盒機制,應⽤只能在⼏個目錄下讀寫文件數組
// 獲取Documents目錄 - (NSString *)docPath { /** NSSearchPathForDirectoriesInDomains: 獲取文件目錄路徑 參數一: 要獲取的目錄名稱 參數二: 要查找的目錄的主目錄(沙盒目錄) 參數三: 是否返回完整的路徑 **/ return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; }
// 獲取 Library目錄 - (NSString *)libPath { return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject]; }
// 獲取緩存目錄路徑 - (NSString *)cachesPath { return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject]; }
// 獲取Tem目錄 - (NSString *)temPath { return NSTemporaryDirectory(); }
###1.3文件操做:緩存
###1.4沙盒目錄代碼下載 沙盒目錄代碼下載安全
##二、屬性列表 概述:
使⽤屬性列表持久化數據對象很是⽅便,只要是數組或者字典中包含的對象是特定的
可序列話對象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData, NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能夠直接經過NSDictionary和NSArray的實例⽅法將其保存到屬性列表或者從屬性列表中讀取他們。編碼
示列代碼atom
NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [docPath stringByAppendingPathComponent:@"userInfo.plist"]; NSMutableDictionary *userInfos = [NSMutableDictionary dictionary]; [userInfos setObject:@"admin" forKey:@"userName"]; [userInfos setObject:@"55244646435@qq.com" forKey:@"email"];`
一、將字典數據寫入plist文件code
BOOL isSuccess_1 = [userInfos writeToFile:filePath atomically:YES]; NSString *filePath_array = [docPath stringByAppendingPathComponent:@"i"]; NSArray *infos = @[@"1",@"2",@"3"];
二、將數組數據寫入plist文件對象
BOOL isSuccess_2 = [infos writeToFile:filePath_array atomically:YES]; if (isSuccess_2) { NSLog(@"數據寫入成功"); } else { NSLog(@"寫入失敗"); }
三、獲取本地路徑的plist文件圖片
NSArray *infos_ = [NSArray arrayWithContentsOfFile:filePath_array]; // NSDictionary *userInfos = [NSDictionarydictionaryWithContentsOfFile:filePath];
NSUserDefaults 系統提供的plist文件
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
設值
[userDefaults setObject:@100 forKey:@"id"]; [userDefaults setBool:YES forKey:@"isLoad"]; [userDefaults setDouble:3.8408 forKey:@"price"];
同步數據代碼
[deaults synchronize];
取值
id value = [userDefaults objectForKey:@"id"]; NSLog(@"%@",value);
修改
[userDefaults setObject:@2000 forKey:@"id"]; [userDefaults synchronize];
###2.1屬性設置代碼下載
##三、對象歸檔
概述:
對象歸檔是將對象歸檔以文件的形式保存到磁盤中(也稱爲序列化,持久化),使⽤的 時候讀取該文件的保存路徑讀取文件的內容(也稱爲接檔,反序列化), (對象歸檔的文件是保密的,在磁盤上⽆法查看文件中的內容,⽽屬性列表是明⽂的,可 以查看)。
###3.1對象歸檔⽅方式:
一、使用 NSKeyedArchiver 進行編碼歸檔
//一、建立文件保存路徑 NSString *dicPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject]; NSString *filePath = [dicPath stringByAppendingPathComponent:@"data.archive"]; //二、設置保存的數據 NSMutableArray *infos = [NSMutableArray array]; [infos addObject:@"One"]; [infos addObject:@100]; [infos addObject:[NSDate date]]; //三、將數據歸檔到指定路徑 [NSKeyedArchiver archiveRootObject:infos toFile:filePath];
二、解歸檔(讀取解碼): NSKeyedUnarchiver
id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath]; User *user_ = (User *)object; NSLog(@"%@ %@",user_.userName, user_.password);
###3.2 自定義對象歸檔 有時候咱們須要本地保存本身定義的一些對象數據,這些對象並無實現<NSCoding>協議,因此在歸檔數據前要先去實現<NSCoding>協議中的方法,在協議方法中對自定義對象屬性的編碼和解碼。以下實現自定義的User類對象的歸檔:
.h中設置屬性並實現<NSCoding>協議 @interface User : NSObject <NSCoding> @property (nonatomic, copy) NSString *userName; @property (nonatomic, copy) NSString *password; @end
對屬性編碼和解碼
.m文件中實現協議方法,encodeWithCoder: 和 initWithCoder:完成對屬性數據的編碼和解碼。 // 編碼 - (void)encodeWithCoder:(NSCoder *)aCoder { [aCoder encodeObject:_userName forKey:@"userName"]; [aCoder encodeObject:_password forKey:@"password"]; } // 解碼 - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder { self = [super init]; if (self ) { self.userName = [aDecoder decodeObjectForKey:@"userName"]; self.password = [aDecoder decodeObjectForKey:@"password"]; } return self; } @end
###3.3對象歸檔代碼下載