iOS 數(shù)據(jù)持久化-沙盒機制介紹(一)

什么是沙盒機制?

我們手中的iphone/ipad設備上包含著閃存(flash memory),它的功能和一個硬盤功能等價。當設備斷電后數(shù)據(jù)依然能夠被保存下來,應用程序可以把數(shù)據(jù)文件保存到閃存上,并且讀取它們。

但是,需要注意的是,我們所開發(fā)的應用程序是無法訪問整個閃存的,因為閃存上面會專門有一部分給我們,這一部分就是屬于我們開發(fā)的整個應用程序的沙盒(sandbox)了。

iOS系統(tǒng)下,每個應用都只能看到自己的沙盒,這就防止對其他應用程序的數(shù)據(jù)文件進行讀寫活動。就像我們的應用程序也能夠看見一些系統(tǒng)擁有的高級別目錄,但是卻無法進行任何的寫入操作。

沙盒目錄:

AppName.app目錄:這是應用程序的程序包目錄,包含應用程序的本身。由于應用程序必須經(jīng)過簽名,所以您在運行時不能對這個目錄中的內(nèi)容進行修改,否則可能會使應用程序無法啟動。

Documents目錄:應用會將數(shù)據(jù)存儲在這個文件夾里,但是基于NSUserDefaults 的首選項設置除外;

Library目錄:基于NSUserDefaults的首選項設置存儲在 Library/Preferences 文件夾中,且Library下面有Preferences和Caches目錄;

tmp目錄:供應用存儲臨時文件,當iOS設備進行同步操作時,iTunes并不會備份這個文件夾的文件,但是在不需要這些文件的時候,應用需要刪除tmp中的這些文件,以免占用文件系統(tǒng)空間;

沙盒目錄

Documents目錄

由于iOS中應用的數(shù)據(jù)存儲是沙盒機制,因此讀取和寫入文件,我們需要調(diào)用C函數(shù) “NSSearchPathForDirectoriesInDomains()”來查找各種目錄,(這個C函數(shù)可以基于Mac OS X平臺的Cocoa共享)

如檢索Documents目錄路徑的代碼:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *pathDirectory = [paths objectAtIndex:0];

第一個常量NSDocumentDirectory表示我們正在查找目錄的路徑,

第二個常量NSUserDomainMask表明我們希望將搜索限制在應用的沙盒內(nèi);(在Mac OS X中,此常量表示我們希望該函數(shù)查看用戶的主目錄,因此才會有這個命名;)

返回的paths是一個數(shù)組,為什么位于索引0就是我們需要的Documents目錄?因為每一個應用只有一個Documents目錄,因此只有一個目錄符合這個條件;接下來,我們可以為剛才檢索到的目錄pathDirectory的結(jié)尾加一個字符串來創(chuàng)建一個文件名,如下:

//注意是stringByAppendingPathComponent,不要拼錯。

NSString *filename = [pathDirectory stringByAppendingPathComponent:@"data.txt"];

這個時候我們得到的filename字符串就可以進行創(chuàng)建、讀取、寫入文件了。


Library目錄:

這個目錄下有兩個子目錄:

Preferences 目錄:包含應用程序的偏好設置文件。您不應該直接創(chuàng)建偏好設置文件,而是應該使用NSUserDefaults類來取得和設置應用程序的偏好.iOS的Settings(設置)應用會在該目錄中查找應用的設置信息。iTunes同步設備時會備份該目錄。

Caches 目錄:用于存放應用程序?qū)S玫闹С治募4鎽贸绦蛟俅螁舆^程中需要的信息。可創(chuàng)建子文件夾。可以用來放置您希望被備份但不希望被用戶看到的數(shù)據(jù)。該路徑下的文件夾,除Caches以外,都會被iTunes備份。

1.獲取Library的目錄路徑

NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];

2.獲取Caches目錄路徑

NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];


tmp目錄:

可以用NSTemporaryDirectory()的Foundation函數(shù)返回一個字符串,該字符串包含到應用臨時目錄的完整路徑。 同上,在結(jié)尾附上文件名就可以創(chuàng)建指向該目錄下的文件路徑了。

NSString *tmpPath = NSTemporaryDirectory();

NSString *temFile = [tmpPath stringByAppendingPathComponent:@"tempFile.txt"];


AppName.app目錄

獲取應用程序程序包中資源,如:獲取本地txt文件中的內(nèi)容

NSString *path = [[NSBundle mainBundle] pathForResource:@"data" ofType:@"txt"];

NSString *data = [[NSString alloc] initWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

下一篇:iOS 數(shù)據(jù)持久化-四種存儲方式(二)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內(nèi)容

  • 前言:突然想學習一下,沙盒,看了那么多博客,我四處的搜集一下總結(jié)一下,為了以后方便學習,留存一篇整合的文章。 一、...
    麥穗0615閱讀 12,384評論 5 28
  • 沙盒機制 出于安全考慮,iPhone對于安裝在上面的應用程序有所限制,這個限制就是應用程序只能在為該改程序創(chuàng)建的文...
    Joker_King閱讀 13,278評論 1 15
  • iOS開發(fā)之沙盒機制(SandBox)詳細講解了沙盒的一些機制。在開發(fā)中,我們需要對沙盒進行操作,所以我們需要獲取...
    小灬博閱讀 3,836評論 1 4
  • iOS沙盒機制 沙盒機制 不好意思,我又一次來到了你們的世界,其實我是拒絕的,但是我的無法忍受內(nèi)心的躁動!額我TM...
    iOSDevVicky閱讀 2,021評論 0 12
  • 終于明白很多道理,明白是明白,但要在等待中才會懂得,懂得等不到的東西,也不要去期盼,就像不去考驗人性,但雖...
    馬冬梅的向日葵閱讀 125評論 2 2