iOS數據持久化

#數據持久化 ##一、文件管理 ###1.1iOS沙盒機制:
iOS應⽤用程序只能在爲該改程序建立的文件系統中讀取文件,不能夠去其它地方訪問,此區域被成爲沙盒,因此全部的非代碼⽂件都要保存在此,例如圖像,圖標,聲音,映像,屬性列表,文本文件 等。
• 每一個應⽤程序都有⾃己的存儲空間
• 應⽤程序不能翻過自⼰的圍牆去訪問別的存儲空間的內容
• 應用程序請求的數據都要經過權限檢測,假如不符合條件的話,不會被放行。git

輸入圖片說明

經過這張圖只能從表層上理解sandbox是一種安全體系,應⽤程序的全部操做都要經過這個體系來執行,其中核心內容是:sandbox對應⽤程序執行各類操做的權限限制。github

  • 應用沙盒路徑
// 沙盒目錄路徑
   NSString *homePath =  NSHomeDirectory();

   // Documents 目錄
   NSString *documentsPath = [homePath stringByAppendingPathComponent:@"Documents"];

###1.2目錄結構: 默認狀況下,每一個沙盒含有3個⽂件夾:Documents, Library 和 tmp。由於應⽤用的沙盒機制,應⽤只能在⼏個目錄下讀寫文件數組

輸入圖片說明

  • Documents:蘋果建議將程序中建⽴的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢 復的時候會包括此目錄
// 獲取Documents目錄
- (NSString *)docPath {
    
    /** NSSearchPathForDirectoriesInDomains: 獲取文件目錄路徑
     
     參數一: 要獲取的目錄名稱
     參數二: 要查找的目錄的主目錄(沙盒目錄)
     參數三: 是否返回完整的路徑
     **/
    
   return [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
}
  • Library:存儲程序的默認設置或其它狀態信息;(iTunes備份和恢復的時候會包含此目錄)
// 獲取 Library目錄
- (NSString *)libPath {
    
    return [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
}
  • Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下文件不會在應用退出刪除
// 獲取緩存目錄路徑
- (NSString *)cachesPath {
    
    return [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) lastObject];
}
  • tmp:提供一個即時建立臨時⽂件的地⽅方。(系統重啓後會刪除tmp裏的全部文件)
// 獲取Tem目錄
- (NSString *)temPath {
    
    return NSTemporaryDirectory();
}

###1.3文件操做:緩存

  1. 獲取程序的Home路徑
  2. 獲取Documents路徑
  3. 獲取Library路徑
  4. 獲取緩存路徑
  5. 獲取tmp路徑
  6. ⽂件寫入
  7. ⽂件讀取
  8. 刪除文件

###1.4沙盒目錄代碼下載 沙盒目錄代碼下載安全


##二、屬性列表 概述:
使⽤屬性列表持久化數據對象很是⽅便,只要是數組或者字典中包含的對象是特定的
可序列話對象(包括NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData, NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能夠直接經過NSDictionaryNSArray的實例⽅法將其保存到屬性列表或者從屬性列表中讀取他們。編碼

示列代碼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對象歸檔⽅方式:

  1. 簡單歸檔
  2. 對多個對象進⾏行歸檔
  3. 對⾃自定義對象進⾏行歸檔

一、使用 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對象歸檔代碼下載

對象歸檔代碼下載

相關文章
相關標籤/搜索