標籤:
前言:個人覺得開發人員最大的悲哀莫過於懂得使用卻不明白其中的原理.在代碼之前我覺得還是有必要簡單闡述下相關的一些知識點. 因為文章或深或淺總有適合的人群.若有朋友發現了其中不正確的觀點還望多多指出,不勝感激.什麼叫資料持久化:
在這裡我就不照搬教科書上抽象的概念了.我覺得既然要把東西寫出來就讓它簡單明了.
要搞清楚資料持久化,首先要知道資料持久化是相對於緩衝而言的,緩衝是在程式啟動並執行過程中儲存在記憶體中,程式一旦運行結束,其記憶體就會被釋放.緩衝在記憶體中的資料也就隨之消失.
那麼資料持久化就是要解決上述的這個問題,如常見的用處:儲存使用者佈建的頭像,暱稱等這些重要訊息.
解決的思路如下:將程式運行過程中需要儲存的資料通過一定的形式(某些載體)儲存起來而不是簡單地在程式運行過程中緩衝起來.此操作之後,在程式下次啟動並執行時候可以再將這些資料從儲存的載體中讀取出來,那麼我們也就實現了資料持久化
(儲存的操作叫做序列化,讀取解析操作叫還原序列化)
簡言之就是:將資料通過一定的形式儲存起來並在需要時再讀取解析就實現了所謂的資料持久化
資料存放區大致分為兩大方式
1.檔案儲存體
將需要的資料通過檔案儲存體起來如:bin檔案xml檔案txt檔案等等..
2.資料庫儲存
將資料儲存到資料庫相應的表欄位中, 常見的資料庫有SQLServer MySQL Oracle 以及SQLite
下面將介紹IOS開發中的檔案儲存體形式,其他內容將在以後部落格中介紹 1.檔案儲存路徑--應用沙箱
我們剛剛說到將資料儲存到檔案中,那麼有檔案就有檔案儲存的路徑.
在IOS中,我們的應用將打包其檔案到特定的檔案夾(目錄)中,這種個檔案夾 叫做應用沙箱,每個應用都有自己的應用沙箱,並且每個沙箱之間是相互獨立的.這樣做的原因,兩個字:安全.相互獨立,也就是說程式無法隨意篡改或刪除其他程式的檔案,瀏覽器中儲存cookie的檔案也是如此,不同網域名稱有不同的cookie檔案,並且無法訪問其他網域名稱下相關的cookie的檔案...扯遠了,有興趣的朋友自己擴充
2.初步瞭解沙箱的目錄結構
1) 拿到我們應用沙箱的根路徑: NSHomeDirectory()
2) 步驟:
步驟一:在viewDidLoad:如所示,右邊顯示便是沙箱路徑(複製)
步驟二:開啟Finder 並按下快速鍵cmd+shift+G 輸入沙箱路徑 並斷行符號
步驟三,得到沙箱結構圖
3.應用沙箱結構作用說明
Document
特點:儲存程式運行時產生的資料,並且會通過ICloud自動備份,若使用者通過ITunes進行同步時預設也將備份該目錄
Library/Caches
一般儲存的是可以重新下載或重建的資料,一般是體積大非重要的資料
Library/Preferences
儲存應用所以的喜好設定,如使用者選擇記住密碼. 使用者通過ITunes進行同步時預設將備份該目錄
tmp
儲存程式運行時產生的臨時資料,使用完成將刪除.注意刪除以免浪費使用者空間
所以我們根據在儲存資料檔案的時候需要結合上面所列的目錄特點,將對應的資料儲存至適當的路徑下面 4.擷取路徑相關代碼:(以Documents 為例)
兩種方式:
1.拼接:
NSString homePath = NSHomeDirectory();//擷取沙箱根路徑
NSString documentPath = [ homePath stringByAppendingPathComponent:@"Documents"];
2.搜尋目錄
NSArray*pathArray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, NO);
NSString documentPath = [pathArray objectAtIndexOf :0];
資料存放區之屬性列表
1).什麼是屬性列表:
屬性列表本質上是XML格式的尾碼名位plist的檔案(空格鍵預覽可以看到明顯的xml結構):
2).特點:
儲存的資料量較小,預設情況下只適用於特定對象
如:NSArray,NSMutableArray,NSDictionary,NSMutableDictionary,NSData,NSMutableData,NSString,NSMutableString,NSNumber,NSDate
3).代碼
儲存(歸檔,以NSDictionary為例)
-(void)writeDictionaryToFile{ //1.初始化對象 NSDictionary *dic = @{ @"name":@"jack", @"country":@"China", @"province":@"GuangDong" }; //2.儲存路徑(Documents) NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path = [path stringByAppendingPathComponent:@"testdic.plist"]; //3儲存檔案 [dic writeToFile:path atomically:YES];}
程式運行後我們找到建立好的檔案,開啟效果:
讀取(解檔)代碼:
-(void)readDictionaryFromFile{ //1.擷取路徑 NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; path = [path stringByAppendingPathComponent:@"testdic.plist"]; //2.讀取檔案中的資料 NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:path]; NSLog(@"%@",dic);}
(斷點):
至此我們已經實現了資料的儲存和讀取,但是只限於系統預設支援的對象,現實開發中我們經常需要將自訂的對象進行歸檔.限於篇幅,下篇部落格再續
IOS開發--資料持久化篇之檔案儲存體(一)