數據的持久化

1、沙盒目錄

###一、基本概念:       IOS應用程序只能在爲該改程序建立的文件系統中讀取文件,不能夠去其它地方訪問,此區域被成爲沙盒.因此全部的非代碼⽂件都要保存在此,例如圖像、圖標、聲音、映像、屬性列表、⽂本文件等.sql

二、規則

  • 每一個應⽤程序都有⾃己的存儲空間
  • 應⽤程序不能翻過⾃己的圍牆去訪問別的存儲空間的內容
  • 應用程序請求的數據都要經過權限檢測,假如不符合條件的話,不會被放⾏

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

Documents:蘋果建議將程序中創建的或在程序中瀏覽到的文件數據保存在該目錄下,iTunes備份和恢復的時候會包括此目錄
Library:存儲程序的默認設置或其它狀態信息;(iTunes備份和恢復的時候會包含此目錄)Library/Caches:存放緩存文件,iTunes不會備份此目錄,此目錄下⽂件不會在應⽤用退出刪除
tmp: 提供⼀個即時建立臨時文件的地方。(系統重啓後會刪除tmp裏的全部文件)編程

//沙盒目錄路徑數組

NSString *homePath =  NSHomeDirectory();

//Documents目錄緩存

NSString *documentsPath = [homePath  
     stringByAppendingPathComponent:@"Documents"];  
// 獲取Documents目錄
- (NSString *)docPath {
  
/** NSSearchPathForDirectoriesInDomains: 獲取文件目錄路徑
   
   參數一: 要獲取的目錄名稱
   參數二: 要查找的目錄的主目錄(沙盒目錄)
   參數三: 是否返回完整的路徑
**/
  
return [NSSearchPathForDirectoriesInDomains  
(NSDocumentDirectory, NSUserDomainMask, YES)  
  lastObject];
}

2、文件管理

###一、文件操做 1.獲取程序的Home路徑
2.獲取Documents路徑
3.獲取Library路徑
4.獲取緩存路徑
5.獲取tmp路徑
6.文件寫⼊
7.文件讀取
8.刪除文件數據結構

###二、建立目錄 文件管理類:用於管理(增、刪、改、查)沙盒目錄文件編程語言

NSFileManager *fileManager = [NSFileManager   
                             defaultManager];
NSString *dataPath = [[self docPath]  
     stringByAppendingPathComponent:@"Datas"];
    
NSError *error = nil;

使用NSFileManager建立目錄函數

BOOL isCreated = [fileManager createDirectoryAtPath:  
dataPath withIntermediateDirectories:NO attributes:nil error:&error];
    
if (isCreated) {
    NSLog(@"建立目錄成功");
    } else {   
      NSLog(@"建立目錄失敗");
    }
    
    NSLog(@"%@",dataPath);
}

根據指導的路徑移除、移動文件編碼

//移除文件
BOOL isRemoved = [fileManager removeItemAtPath:  
                 filePath error:nil];   
//移動文件 
BOOL isMoved = [fileManager moveItemAtPath:  
               filePath toPath:toPath error:nil];

3、屬性列表

    使用屬性列表持久化數據對象⾮常方便,只要是數組或者字典中包含的對象是特定的可序列話對象(NSArray,NSMutableArray,NSDictionary, NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate),就能夠直接經過NSDictionary和NSArray的實例方法將其保存到屬性列表或者從屬性列表中讀取他們。atom

將字典數據寫入plist文件

BOOL isSuccess_1 = [userInfos writeToFile:filePath   
                   atomically:YES];  
NSString *filePath_array = [docPath  
 stringByAppendingPathComponent:@"infos.plist"];  
 
NSArray *infos = @[@"1",@"2",@"3"];
// 數據同步(即便更新數據)
[userDefaults synchronize];
    
// 取值
id value = [userDefaults objectForKey:@"id"];
    NSLog(@"%@",value);
    
// 修改
[userDefaults setObject:@2000 forKey:@"id"];
[userDefaults synchronize];

4、數據歸檔

一、概述

    對象歸檔是將對象歸檔以文件的形式保存到磁盤中(也稱爲序列化,持久化),使用的時候讀取該文件的保存路徑讀取文件的內容(也稱爲接檔,反序列化),(對象歸檔的⽂件是保密的,在磁盤上沒法查看⽂件中的內容,而屬性列表是明文的,能夠查看)。

二、對象歸檔方式

1.簡單歸檔
2.對多個對象進⾏行歸檔
3.對自定義對象進行歸檔
###三、示例代碼 歸檔自定義的對象的前提是要實現 <NSCoding> 協議,對象的屬性進行編碼和解碼

歸檔(編碼保存):

BOOL isSuccess = [NSKeyedArchiver archiveRootObject:user toFile:filePath];
if (isSuccess) {
        
    NSLog(@"成功");
    } else {
        
      NSLog(@"失敗");
    }
 NSLog(@"%@",docPath);

將數據以二進制的形式保存,經常使用的NSString、NSArray、NSDictionary.... 能夠直接歸檔保存,由於它們都實現了 <NSCoding> 協議 :NSKeyedArchiver

解歸檔(讀取解碼):NSKeyedUnarchiver

id object = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
User *user_ = (User *)object;  

NSLog(@"%@  %@",user_.userName, user_.password);

5、SQLite

一、概述

數據庫(Database)是按照數據結構來組織、存儲和管理數據的倉庫。 ###二、三個階段 (1)文件管理階段
(2)文件系統階段
(3)數據庫管理系統階段
###三、數據庫模型 (1)層次模型
(2)網狀模型
(3)關係模型
###四、SQLite      SQLite 是一個開源的嵌入式關係數據庫,實現自包容、零配置、支持事務的SQL數據庫引擎。其特色是高度便攜、使用結構緊湊、⾼效、可靠。與其餘數據庫管理系統不一樣,SQLite的安裝和運行⾮常簡單,在⼤多數狀況下, 只要確保SQLite的⼆進制⽂件存在,便可開始建立、鏈接和使用數據庫。若是您正在尋找一個嵌入式數據庫項目或解決方案, SQLite是絕對值得考慮。
###五、SQL語言     結構化查詢語言(Structured Query Language)簡稱SQL,是一種特殊目的的編程語言,是⼀種數據庫查詢和程序設計語言,⽤於存取數據以及查詢、更新和管理關係數據庫系統。
###六、SQLite的數據類型 (1)NULL,值是NULL
(2)INTEGER,值是有符號整形,根據值的⼤小以1,2,3,4,6或8字節存放
(3)REAL,值是浮點型值,以8字節IEEE浮點數存放
(4)TEXT,值是⽂本字符串,使⽤數據庫編碼(UTF-8,UTF-16BE或者UTF-16LE)存放
(5)BLOB,只是⼀個數據塊,徹底按照輸⼊存放(即沒有準換)
###七、數據庫的操做 1.建立數據庫
2.建立表
3.刪除表
4.添加數據

#數據庫表中插入數據
- (void)insertValues {
    
    NSString *userID = @"100015";
    NSString *userName = @"李楊";
    int age = 20;
    
    NSString *sql = [NSString stringWithFormat:@"INSERT INTO User('userID','userName','userAge') VALUES('%@','%@',%d)",userID,userName,age];
    
 // sqlite3_exec() 執行 sql 函數
    int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);
    
    if (result == SQLITE_OK) {
        
        NSLog(@"插入數據成功");
    } else {
        
        NSLog(@"失敗");
    }
}

5.查詢數據

//建立sql語句結構體指針(能夠理解爲sql語句對象)
    sqlite3_stmt *_stmt;
    
    // NSString *sql = @"SELECT *FROM User";
    
    NSString *key = @"張";
    NSString *sql = [NSString stringWithFormat:@"SELECT *FROM User WHERE userName LIKE '%%%@%%'",key];
    
    
//編譯查詢語句
    int result = sqlite3_prepare_v2(_sqliteDB,[sql UTF8String],-1,&_stmt,NULL);
    
    if (result == SQLITE_OK) {
        NSLog(@"sql語句編譯經過");
        
         NSMutableArray *users = [NSMutableArray array];
        
//執行查詢語句,== SQLITE_ROW 表示還有下一條數據
        while (sqlite3_step(_stmt) == SQLITE_ROW) {

把查詢到的數據保存爲 model 對象

User *user = [[User alloc] init];
user.userID = userID_str;
user.userName = userName_str;
user.userSex = userSex_str;
[users addObject:user];
            
NSLog(@"%@, %@, %d,%@",userID_str,userName_str,userAge,userSex_str);

6.更新數據

NSString *userSex = @"男";
NSString *userName = @"電風扇";
NSString *sql = [NSString stringWithFormat:@"UPDATE User SET userSex = '%@' WHERE userName = '%@'",userSex,userName];
    
// sqlite3_exec() 執行 sql 函數
int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);

7.刪除數據

NSString *userName = @"電風扇";
NSString *sql = [NSString stringWithFormat:@"DELETE FROM User WHERE userName = '%@'",userName];
    
// sqlite3_exec() 執行 sql 函數
int result = sqlite3_exec(_sqliteDB,[sql UTF8String],NULL,NULL,NULL);
相關文章
相關標籤/搜索