日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

iOS 文件和数据管理 (可能会删除本地文件储存)

發(fā)布時(shí)間:2023/12/19 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 iOS 文件和数据管理 (可能会删除本地文件储存) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

轉(zhuǎn)自:http://www.apple.com.cn/developer/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/FilesandNetworking/FilesandNetworking.html

文件和數(shù)據(jù)管理

iPhone OS系統(tǒng)上的文件和用戶的媒體數(shù)據(jù)及個(gè)人文件共享閃存上的空間。出于安全的目的,您的應(yīng)用程序被放在其自己的目錄下,并且只能對(duì)該目錄進(jìn)行讀寫(xiě)。本章的下面部分將描述應(yīng)用程序本地文件系統(tǒng)的結(jié)構(gòu)及幾個(gè)讀寫(xiě)文件的技術(shù)。

常用目錄

出于安全的目的,應(yīng)用程序只能將自己的數(shù)據(jù)和偏好設(shè)置寫(xiě)入到幾個(gè)特定的位置上。當(dāng)應(yīng)用程序被安裝到設(shè)備上時(shí),系統(tǒng)會(huì)為其創(chuàng)建一個(gè)家目錄。表6-1列出了應(yīng)用程序家目錄下的一些重要子目錄,您的程序可能需要對(duì)其進(jìn)行訪問(wèn)。表中還描述了每個(gè)目錄的設(shè)計(jì)目的和訪問(wèn)限制,以及iTunes是否對(duì)該目錄下的內(nèi)容進(jìn)行備份。有關(guān)備份和恢復(fù)過(guò)程的更多信息,請(qǐng)參見(jiàn)“備份和恢復(fù)”?部分;有關(guān)應(yīng)用程序家目錄本身的信息,則請(qǐng)參見(jiàn)?“應(yīng)用程序沙箱”部分。

表 6-1??iPhone應(yīng)用程序的目錄

目錄

描述

<Application_Home>/AppName.app

這是程序包目錄,包含應(yīng)用程序的本身。由于應(yīng)用程序必須經(jīng)過(guò)簽名,所以您在運(yùn)行時(shí)不能對(duì)這個(gè)目錄中的內(nèi)容進(jìn)行修改,否則可能會(huì)使應(yīng)用程序無(wú)法啟動(dòng)。

在iPhone OS 2.1及更高版本的系統(tǒng),iTunes不對(duì)這個(gè)目錄的內(nèi)容進(jìn)行備份。但是,iTunes會(huì)對(duì)在App Store上購(gòu)買(mǎi)的應(yīng)用程序進(jìn)行一次初始的同步。

<Application_Home>/Documents/

您應(yīng)該將所有的應(yīng)用程序數(shù)據(jù)文件寫(xiě)入到這個(gè)目錄下。這個(gè)目錄用于存儲(chǔ)用戶數(shù)據(jù)或其它應(yīng)該定期備份的信息。有關(guān)如何取得這個(gè)目錄路徑的信息,請(qǐng)參見(jiàn)“獲取應(yīng)用程序目錄的路徑”部分。

iTunes會(huì)備份這個(gè)目錄的內(nèi)容。

<Application_Home>/Library/Preferences

這個(gè)目錄包含應(yīng)用程序的偏好設(shè)置文件。您不應(yīng)該直接創(chuàng)建偏好設(shè)置文件,而是應(yīng)該使用NSUserDefaults類或CFPreferences?API來(lái)取得和設(shè)置應(yīng)用程序的偏好,詳情請(qǐng)參見(jiàn)“添加Settings程序包”部分。

iTunes會(huì)備份這個(gè)目錄的內(nèi)容。

<Application_Home>/Library/Caches

這個(gè)目錄用于存放應(yīng)用程序?qū)S玫闹С治募?#xff0c;保存應(yīng)用程序再次啟動(dòng)過(guò)程中需要的信息。您的應(yīng)用程序通常需要負(fù)責(zé)添加和刪除這些文件,但在對(duì)設(shè)備進(jìn)行完全恢復(fù)的過(guò)程中,iTunes會(huì)刪除這些文件,因此,您應(yīng)該能夠在必要時(shí)重新創(chuàng)建。您可以使用“獲取應(yīng)用程序目錄的路徑”?部分描述的接口來(lái)獲取該目錄的路徑,并對(duì)其進(jìn)行訪問(wèn)。

在iPhone OS 2.2及更高版本,iTunes不對(duì)這個(gè)目錄的內(nèi)容進(jìn)行備份。

<Application_Home>/tmp/

這個(gè)目錄用于存放臨時(shí)文件,保存應(yīng)用程序再次啟動(dòng)過(guò)程中不需要的信息。當(dāng)您的應(yīng)用程序不再需要這些臨時(shí)文件時(shí),應(yīng)該將其從這個(gè)目錄中刪除(系統(tǒng)也可能在應(yīng)用程序不運(yùn)行的時(shí)候清理留在這個(gè)目錄下的文件)。有關(guān)如何獲得這個(gè)目錄路徑的信息,請(qǐng)參見(jiàn)“獲取應(yīng)用程序目錄的路徑”部分。

在iPhone OS 2.1及更高版本,iTunes不對(duì)這個(gè)目錄的內(nèi)容進(jìn)行備份。

備份和恢復(fù)

您不需要在應(yīng)用程序中為備份和恢復(fù)操作做任何準(zhǔn)備。在iPhone OS 2.2及更高版本的系統(tǒng)中,當(dāng)設(shè)備被連接到計(jì)算機(jī)并完成同步時(shí),iTunes會(huì)對(duì)除了下面這些目錄之外的所有文件進(jìn)行增量式的備份:

  • <Application_Home>/AppName.app

  • <Application_Home>/Library/Caches

  • <Application_Home>/tmp

雖然iTunes確實(shí)對(duì)應(yīng)用程序的程序包本身進(jìn)行備份,但并不是在每次同步時(shí)都進(jìn)行這樣的操作。通過(guò)設(shè)備上的App Store購(gòu)買(mǎi)的應(yīng)用程序在下一次設(shè)備和iTunes同步時(shí)進(jìn)行備份。而在之后的同步操作中,應(yīng)用程序并不進(jìn)行備份,除非應(yīng)用程序包本身發(fā)生了變化(比如由于應(yīng)用程序被更新了)。

為了避免同步過(guò)程花費(fèi)太長(zhǎng)時(shí)間,您應(yīng)該有選擇地往應(yīng)用程序家目錄中存放文件。<Application_Home>/Documents目錄應(yīng)該用于存放用戶數(shù)據(jù)文件或不容易在應(yīng)用程序中重新創(chuàng)建的文件。存儲(chǔ)臨時(shí)數(shù)據(jù)的文件應(yīng)該放在Application Home/tmp目錄,而且應(yīng)該在不需要的時(shí)候?qū)⑵鋭h除。如果您的應(yīng)用程序需要?jiǎng)?chuàng)建用于下次啟動(dòng)的數(shù)據(jù)文件,則應(yīng)該將那些文件放到Application Home/Library/Caches目錄下。

請(qǐng)注意:如果您的應(yīng)用程序需要?jiǎng)?chuàng)建數(shù)據(jù)量大或頻繁變化的文件,則應(yīng)該考慮將它們存儲(chǔ)在Application Home/Library/Caches目錄下,而不是<Application_Home>/Documents目錄。備份大數(shù)據(jù)文件會(huì)使備份過(guò)程顯著變慢,備份頻繁變化(因此必須頻繁備份)的文件也同樣如此。將這些文件放到Caches目錄下可以避免每次同步都對(duì)其進(jìn)行備份(在iPhone OS 2.2及更高版本)。

有關(guān)如何在應(yīng)用程序中使用目錄的更多信息,請(qǐng)參見(jiàn)表6-1

在應(yīng)用程序更新過(guò)程中被保存的文件

更新應(yīng)用程序就是將用戶下載的新版應(yīng)用程序代替之前的版本。在這個(gè)過(guò)程中,iTunes會(huì)將更新過(guò)的應(yīng)用程序安裝到新的應(yīng)用程序目錄下,并在刪除老版本之前,將用戶數(shù)據(jù)文件轉(zhuǎn)移到新的應(yīng)用程序目錄下。在更新的過(guò)程中,iTunes保證如下目錄中的文件會(huì)得以保留:

  • <Application_Home>/Documents

  • <Application_Home>/Library/Preferences

雖然其它用戶目錄下的文件也可能被轉(zhuǎn)移,但是您不應(yīng)該假定更新之后該文件還仍然存在。

Keychain數(shù)據(jù)

keychain是一個(gè)安全、經(jīng)過(guò)加密保護(hù)的容器,用于保存密碼和其它秘密信息。應(yīng)用程序的keychain數(shù)據(jù)存儲(chǔ)在應(yīng)用程序沙箱之外。如果應(yīng)用程序被卸載,則該數(shù)據(jù)會(huì)自動(dòng)被刪除。當(dāng)用戶通過(guò)iTunes備份應(yīng)用程序數(shù)據(jù)時(shí),keychain數(shù)據(jù)也會(huì)被備份。然而,keychain數(shù)據(jù)只能被恢復(fù)到之前做備份的設(shè)備上。應(yīng)用程序的更新并不影響其keychain數(shù)據(jù)。

有關(guān)iPhone OS keychain的更多信息,請(qǐng)參見(jiàn)Keychain服務(wù)編程指南文檔中的“Keychain服務(wù)的概念”部分。

獲取應(yīng)用程序目錄的路徑

系統(tǒng)在各個(gè)級(jí)別上都提供了用于獲取應(yīng)用程序沙箱目錄路徑的編程方法。然而,取得這些路徑的推薦方式還是使用Cocoa編程接口。NSHomeDirectory函數(shù)(在Foundation框架中)負(fù)責(zé)返回頂級(jí)家目錄的路徑—也就是包含應(yīng)用程序、Documents、Library、和tmp目錄的路徑。除了這個(gè)函數(shù),您還可以用NSSearchPathForDirectoriesInDomains和NSTemporaryDirectory函數(shù)來(lái)取得Documents、Caches、和tmp目錄的準(zhǔn)確路徑。

NSHomeDirectory和NSTemporaryDirectory函數(shù)都通過(guò)NSString對(duì)象返回正確格式的路徑。您可以通過(guò)NSString類提供的與路徑相關(guān)的方法來(lái)修改路徑信息或創(chuàng)建新的路徑字符串。舉例來(lái)說(shuō),在取得臨時(shí)的目錄路徑之后,您可以附加一個(gè)文件名,并用結(jié)果字符串在臨時(shí)目錄下創(chuàng)建給定名稱的文件。

請(qǐng)注意:如果您使用帶有ANSI C編程接口的框架—包括那些接受路徑參數(shù)的接口—請(qǐng)記住NSString對(duì)象和其在Core Foundation框架中的等價(jià)類型之間是“免費(fèi)橋接”的。這意味著您可以將一個(gè)NSString對(duì)象(比如上述某個(gè)函數(shù)的返回結(jié)果)強(qiáng)制類型轉(zhuǎn)換為一個(gè)CFStringRef類型,如下面的例子所示:

CFStringRef homeDir = (CFStringRef)NSHomeDirectory();
有關(guān)免費(fèi)橋接的更多信息,請(qǐng)參見(jiàn)?Carbon-Cocoa集成指南文檔。

Foundation框架中的NSSearchPathForDirectoriesInDomains函數(shù)用于取得幾個(gè)應(yīng)用程序相關(guān)目錄的全路徑。在iPhone OS上使用這個(gè)函數(shù)時(shí),第一個(gè)參數(shù)指定正確的搜索路徑常量,第二個(gè)參數(shù)則使用NSUserDomainMask常量。表6-2列出了大多數(shù)常用的常量及其返回的目錄。

表6-2??常用的搜索路徑常量

常量

目錄

NSDocumentDirectory

<Application_Home>/Documents

NSCachesDirectory

<Application_Home>/Library/Caches

NSApplicationSupportDirectory

<Application_Home>/Library/Application Support

由于NSSearchPathForDirectoriesInDomains函數(shù)最初是為Mac OS X設(shè)計(jì)的,而Mac OS X上可能存在多個(gè)這樣的目錄,所以它的返回值是一個(gè)路徑數(shù)組,而不是單一的路徑。在iPhone OS上,結(jié)果數(shù)組中應(yīng)該只包含一個(gè)給定目錄的路徑。程序清單6-1顯示了這個(gè)函數(shù)的典型用法。

程序清單6-1?取得指向應(yīng)用程序Documents目錄的文件系統(tǒng)路徑

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];

在調(diào)用NSSearchPathForDirectoriesInDomains函數(shù)時(shí),您可以使用NSUserDomainMask之外的其它域掩碼參數(shù),或者使用表6-2之外的其它目錄常量,但是應(yīng)用程序不能向其返回的目錄寫(xiě)入數(shù)據(jù)。舉例來(lái)說(shuō),如果您指定NSApplicationDirectory作為目錄參數(shù),同時(shí)指定NSSystemDomainMask作為域掩碼參數(shù),則可以返回(設(shè)備上的)/Applications路徑,但是,您的應(yīng)用程序不能往該位置寫(xiě)入任何文件。

另外一個(gè)需要記住的考慮是,不同平臺(tái)的目錄位置是不一樣的。NSSearchPathForDirectoriesInDomains、NSHomeDirectory、NSTemporaryDirectory、和其它類似函數(shù)的返回路徑取決于應(yīng)用程序運(yùn)行在設(shè)備還是仿真器上。作為例子,程序清單6-1上顯示的函數(shù)調(diào)用在設(shè)備上返回的路徑(documentsDirectory)大致如下:

/var/mobile/Applications/30B51836-D2DD-43AA-BCB4-9D4DADFED6A2/Documents

但是,它在仿真器上返回的路徑則具有如下的形式:

/Volumes/Stuff/Users/johnDoe/Library/Application Support/iPhone Simulator/User/Applications/118086A0-FAAF-4CD4-9A0F-CD5E8D287270/Documents

在讀寫(xiě)用戶偏好設(shè)置時(shí),請(qǐng)使用NSUserDefaults類或CFPreferences?API。這些接口使您免于構(gòu)造Library/Preferences/目錄路徑和直接讀寫(xiě)偏好文件。有關(guān)使用這些接口的更多信息,請(qǐng)參見(jiàn)“添加Settings程序包”部分。

如果應(yīng)用程序的程序包中包含聲音、圖像、或其它資源,則應(yīng)該使用NSBundle類或CFBundleRef封裝類型來(lái)裝載那些資源。程序包知道應(yīng)用程序內(nèi)部資源應(yīng)該在什么位置上,此外,它還知道用戶的語(yǔ)言偏好,能夠自動(dòng)選擇本地化的資源。有關(guān)程序包的更多信息,請(qǐng)參見(jiàn)“應(yīng)用程序的程序包”部分。

文件數(shù)據(jù)的讀寫(xiě)

iPhone OS提供了如下幾種讀、寫(xiě)、和管理文件的方法:

  • Foundation框架:

    • 如果您可以將應(yīng)用程序數(shù)據(jù)表示為一個(gè)屬性列表,則可以用NSPropertyListSerialization?API來(lái)將屬性列表轉(zhuǎn)換為一個(gè)NSData對(duì)象,然后通過(guò)NSData類的方法將數(shù)據(jù)對(duì)象寫(xiě)入磁盤(pán)。

    • 如果應(yīng)用程序的模型對(duì)象采納了NSCoding協(xié)議,則可以通過(guò)NSKeyedArchiver類、特別是它的archivedDataWithRootObject:方法將模型對(duì)象圖進(jìn)行歸檔。

    • Foundation框架中的NSFileHandle類提供了隨機(jī)訪問(wèn)文件內(nèi)容的方法。

    • Foundation框架中的NSFileManager類提供了在文件系統(tǒng)中創(chuàng)建和操作文件的方法。

  • Core OS調(diào)用:

    • 諸如fopen、fread、和fwrite這些調(diào)用可以用于對(duì)文件進(jìn)行順序或隨機(jī)讀寫(xiě)。

    • mmap和munmap調(diào)用是將大文件載入內(nèi)存并訪問(wèn)其內(nèi)容的有效方法。

請(qǐng)注意:上面的Core OS調(diào)用列表只是列舉一些較為常用的例子。更完全的可用函數(shù)列表請(qǐng)參見(jiàn)iPhone OS手冊(cè)的第三部分中的函數(shù)列表。

本章的下面部分將描述如何使用一些高級(jí)技術(shù)來(lái)進(jìn)行文件的讀寫(xiě)。有關(guān)Foundation框架中與文件相關(guān)類的更多信息,請(qǐng)參見(jiàn)Foundation框架參考。

屬性列表數(shù)據(jù)的讀寫(xiě)

屬性列表是一種數(shù)據(jù)表示形式,用于封裝幾種Foundation(及 Core Foundation)的數(shù)據(jù)類型,包括字典、數(shù)組字符串、日期、二進(jìn)制數(shù)據(jù)、數(shù)值及布爾值。屬性列表通常用于存儲(chǔ)結(jié)構(gòu)化的配置數(shù)據(jù)。舉例來(lái)說(shuō),每個(gè)Cocoa和iPhone應(yīng)用程序中都有一個(gè)Info.plist文件,它就是用于存儲(chǔ)應(yīng)用程序本身配置信息的屬性列表。您自己也可以用屬性列表來(lái)存儲(chǔ)其它信息,比如應(yīng)用程序退出時(shí)的狀態(tài)等。

在代碼中,屬性列表的構(gòu)造通常從構(gòu)造一個(gè)字典或數(shù)組、并將它作為容器對(duì)象開(kāi)始,然后在容器中加入其它的屬性列表對(duì)象,(可能)包含其它的字典和數(shù)組。字典的鍵必須是字符串對(duì)象,鍵的值則是NSDictionary、NSArray、NSString、NSDate、NSData、和NSNumber類的實(shí)例。

對(duì)于可以將數(shù)據(jù)表示為屬性列表對(duì)象的應(yīng)用程序(比如NSDictionary對(duì)象),您可以用程序清單6-2所示的方法來(lái)將屬性列表寫(xiě)入磁盤(pán)。該方法將屬性列表序列化為NSData對(duì)象,然后調(diào)用writeApplicationData:toFile:方法(其實(shí)現(xiàn)如程序清單6-4所示)將數(shù)據(jù)寫(xiě)入磁盤(pán)。

程序清單6-2??將屬性列表對(duì)象轉(zhuǎn)換為NSData對(duì)象并寫(xiě)入存儲(chǔ)

- (BOOL)writeApplicationPlist:(id)plist toFile:(NSString *)fileName {
NSString *error;
NSData *pData = [NSPropertyListSerialization dataFromPropertyList:plist format:NSPropertyListBinaryFormat_v1_0 errorDescription:&error];
if (!pData) {
NSLog(@"%@", error);
return NO;
}
return ([self writeApplicationData:pData toFile:(NSString *)fileName]);
}

在iPhone OS系統(tǒng)上保存屬性列表文件時(shí),采用二進(jìn)制格式進(jìn)行存儲(chǔ)是很重要的。在編碼時(shí),可以通過(guò)為dataFromPropertyList:format:errorDescription:方法的format?參數(shù)指定NSPropertyListBinaryFormat_v1_0值來(lái)實(shí)現(xiàn)。二進(jìn)制格式比其它基于文本的格式緊湊得多,這種緊湊不僅使屬性列表在用戶設(shè)備上占用的空間最小,還可以減少讀寫(xiě)屬性列表的時(shí)間。

程序清單6-3的代碼展示了如何從磁盤(pán)裝載屬性列表,并重新生成屬性列表中的對(duì)象。

程序清單 6-3?從應(yīng)用程序的Documents目錄讀取屬性列表對(duì)象

- (id)applicationPlistFromFile:(NSString *)fileName {
NSData *retData;
NSString *error;
id retPlist;
NSPropertyListFormat format;
retData = [self applicationDataFromFile:fileName];
if (!retData) {
NSLog(@"Data file not returned.");
return nil;
}
retPlist = [NSPropertyListSerialization propertyListFromData:retData mutabilityOption:NSPropertyListImmutable format:&format errorDescription:&error];
if (!retPlist){
NSLog(@"Plist not returned, error: %@", error);
}
return retPlist;
}

有關(guān)屬性列表和NSPropertyListSerialization類的更多信息,請(qǐng)參見(jiàn)屬性列表編程指南。

用歸檔器進(jìn)行數(shù)據(jù)讀寫(xiě)

歸檔器的作用是將任意的對(duì)象集合轉(zhuǎn)換為字節(jié)流。這聽(tīng)起來(lái)像是NSPropertyListSerialization類采用的過(guò)程,但它們之間有一個(gè)重要的區(qū)別。屬性列表序列化只能轉(zhuǎn)換一個(gè)有限集合的數(shù)據(jù)類型(大多數(shù)是數(shù)量類型),而歸檔器可以轉(zhuǎn)換任意的Objective-C對(duì)象、數(shù)量類型、數(shù)組、結(jié)構(gòu)、字符串、及更多其它類型。

歸檔過(guò)程的關(guān)鍵在于目標(biāo)對(duì)象的本身。歸檔器操作的對(duì)象必須遵循NSCoding協(xié)議,該協(xié)議定義了讀寫(xiě)對(duì)象狀態(tài)的接口。歸檔器在編碼一組對(duì)象時(shí),會(huì)向每個(gè)對(duì)象發(fā)送一個(gè)encodeWithCoder:消息,目標(biāo)對(duì)象則在這個(gè)方法中將自身的關(guān)鍵狀態(tài)信息寫(xiě)入到對(duì)應(yīng)的檔案中。解檔過(guò)程的信息流與此相反,在解檔過(guò)程中,每個(gè)對(duì)象都會(huì)接收到一個(gè)initWithCoder:消息,用于從檔案中讀取當(dāng)前狀態(tài)信息,并基于這些信息進(jìn)行初始化。解檔過(guò)程完成后,字節(jié)流就被重新組成一組與之前寫(xiě)入檔案時(shí)具有相同狀態(tài)的新對(duì)象。

Foundation框架支持兩種歸檔器—順序歸檔和基于鍵的歸檔。基于鍵的歸檔器更加靈活,是應(yīng)用程序開(kāi)發(fā)中推薦使用的歸檔器。下面的例子顯示如何用一個(gè)基于鍵的歸檔器對(duì)一個(gè)對(duì)象圖進(jìn)行歸檔。_myDataSource對(duì)象的representation方法返回一個(gè)單獨(dú)的對(duì)象(可能是一個(gè)數(shù)組或字典),指向?qū)⒁綑n案中的所有對(duì)象,之后該數(shù)據(jù)對(duì)象就被寫(xiě)入由myFilePath變量指定路徑的文件中。

NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[_myDataSource representation]];
[data writeToFile:myFilePath atomically:YES];

請(qǐng)注意:您還可以向NSKeyedArchiver對(duì)象發(fā)送archiveRootObject:toFile:消息,以便在一個(gè)步驟中完成檔案的創(chuàng)建和將檔案寫(xiě)入存儲(chǔ)。

您可以簡(jiǎn)單地通過(guò)相反的流程來(lái)裝載磁盤(pán)上的檔案內(nèi)容。在裝載磁盤(pán)數(shù)據(jù)之后,可以通過(guò)NSKeyedUnarchiver類及其unarchiveObjectWithData:類方法來(lái)取回模型對(duì)象圖。例如,您可以用下面的代碼來(lái)解檔之前例子中的數(shù)據(jù):

NSData* data = [NSData dataWithContentsOfFile:myFilePath];
id rootObject = [NSKeyedUnarchiver unarchiveObjectWithData:data];

更多如何使用歸檔器和如何使對(duì)象支持NSCoding協(xié)議的信息,請(qǐng)參見(jiàn)Cocoa的歸檔和序列化編程指南。

將數(shù)據(jù)寫(xiě)到Documents目錄

有了封裝應(yīng)用程序數(shù)據(jù)的NSData對(duì)象(或者是檔案,或者是序列化了的屬性列表)之后,您就可以調(diào)用程序清單6-4所示的方法來(lái)將數(shù)據(jù)寫(xiě)到應(yīng)用程序的Documents目錄中。

程序清單6-4??將數(shù)據(jù)寫(xiě)到應(yīng)用程序的Documents目錄

- (BOOL)writeApplicationData:(NSData *)data toFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
if (!documentsDirectory) {
NSLog(@"Documents directory not found!");
return NO;
}
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];
return ([data writeToFile:appFile atomically:YES]);
}

從Documents目錄讀取數(shù)據(jù)

為了從應(yīng)用程序的Documents目錄讀取文件,您首先需要根據(jù)文件名構(gòu)建相應(yīng)的路徑,然后以期望的方法將文件內(nèi)容讀入內(nèi)存。對(duì)于相對(duì)較小的文件—也就是尺寸小于幾個(gè)內(nèi)存頁(yè)面的文件—您可以用程序清單6-5中的代碼來(lái)取得文件內(nèi)容。該代碼首先為Documents目錄下的文件構(gòu)建一個(gè)全路徑,并為這個(gè)路徑創(chuàng)建一個(gè)數(shù)據(jù)對(duì)象,然后返回。

程序清單6-5??從應(yīng)用程序的Documents目錄讀取數(shù)據(jù)

- (NSData *)applicationDataFromFile:(NSString *)fileName {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *appFile = [documentsDirectory stringByAppendingPathComponent:fileName];
NSData *myData = [[[NSData alloc] initWithContentsOfFile:appFile] autorelease];
return myData;
}

對(duì)于載入時(shí)需要多個(gè)內(nèi)存頁(yè)面的文件,應(yīng)該避免一次性地裝載整個(gè)文件。如果您只是計(jì)劃使用部分文件,這一點(diǎn)就尤其重要。對(duì)于大文件,您應(yīng)該考慮用mmap函數(shù)或NSData的initWithContentsOfMappedFile:方法來(lái)將文件映射到內(nèi)存。

到底是采用映射文件還是直接裝載取決于您的考慮。如果只需要少量(3-4)內(nèi)存頁(yè)面,則將整個(gè)文件載入內(nèi)存相對(duì)安全一些。但是,如果您的文件需要數(shù)十或上百個(gè)頁(yè)面,則將文件映射到內(nèi)存可能更為有效一些。當(dāng)然,無(wú)論采用什么方法,您都應(yīng)該測(cè)量應(yīng)用程序的性能,確定裝載文件和為其分配必要內(nèi)存需要多長(zhǎng)時(shí)間。

文件訪問(wèn)的指導(dǎo)原則

在您創(chuàng)建文件或?qū)懭胛募?shù)據(jù)時(shí),請(qǐng)記住下面這些指導(dǎo)原則:

  • 使寫(xiě)入磁盤(pán)的數(shù)據(jù)量盡可能少。文件操作速度相對(duì)較慢,且涉及到Flash盤(pán)的寫(xiě)操作,有一定的壽命限制。下面這些具體的小貼士可以幫助您最少化與文件相關(guān)的操作:

    • 只寫(xiě)入發(fā)生變化的文件部分,但要盡可能對(duì)變化進(jìn)行累計(jì),避免在只有少數(shù)字節(jié)發(fā)生改變時(shí)對(duì)整個(gè)文件進(jìn)行寫(xiě)操作。

    • 在定義文件格式時(shí),將頻繁變化的內(nèi)容放在一起,以便使每次需要寫(xiě)入磁盤(pán)的總塊數(shù)最少。

    • 如果您的數(shù)據(jù)是需要隨機(jī)訪問(wèn)的結(jié)構(gòu)化內(nèi)容,則可以將它們存儲(chǔ)在Core Data持久倉(cāng)庫(kù)或SQLite數(shù)據(jù)庫(kù)中。如果您處理的數(shù)據(jù)量可能增長(zhǎng)到數(shù)兆以上,這一點(diǎn)尤其重要。

  • 避免將緩存文件寫(xiě)入磁盤(pán)。這個(gè)原則的唯一例外是:在應(yīng)用程序退出時(shí),您需要寫(xiě)入某些狀態(tài)信息,使程序在下次啟動(dòng)時(shí)可以回到之前的狀態(tài)。

保存狀態(tài)信息

當(dāng)用戶按下Home鍵時(shí),iPhone OS會(huì)退出您的應(yīng)用程序,返回到Home屏幕。類似地,如果您的應(yīng)用程序打開(kāi)一個(gè)由其它應(yīng)用程序處理的URI模式,iPhone OS也會(huì)退出您的應(yīng)用程序,在相應(yīng)的應(yīng)用程序上打開(kāi)該URI。換句話說(shuō),在Mac OS X上引起應(yīng)用程序掛起或轉(zhuǎn)向后臺(tái)的動(dòng)作,在iPhone OS上都會(huì)使其退出。這些動(dòng)作在移動(dòng)設(shè)備上經(jīng)常發(fā)生,因此,您的應(yīng)用程序必須改變管理可變數(shù)據(jù)和程序狀態(tài)的方式。

大多數(shù)桌面應(yīng)用程序由用戶手工選擇將文件存入磁盤(pán)的時(shí)機(jī),與此不同的是,iPhone應(yīng)用程序應(yīng)該在工作流的關(guān)鍵點(diǎn)上自動(dòng)保存已發(fā)生的變化。究竟何時(shí)保存數(shù)據(jù)由您自己來(lái)決定,但是有兩個(gè)潛在的時(shí)間點(diǎn):或者在用戶做出改變之后馬上進(jìn)行保存;或者將同一頁(yè)面上的變化累計(jì)成批,然后在退出該頁(yè)面、顯示新頁(yè)面、或者應(yīng)用程序退出的時(shí)候進(jìn)行保存。在任何情況下,您不應(yīng)該讓用戶漫游到新的頁(yè)面而不保存之前頁(yè)面的內(nèi)容。

當(dāng)您的應(yīng)用程序被要求退出時(shí),應(yīng)該將當(dāng)前狀態(tài)保持到臨時(shí)的緩存文件或偏好數(shù)據(jù)庫(kù)中。在用戶下次啟動(dòng)應(yīng)用程序時(shí),可以根據(jù)這些信息將程序恢復(fù)到之前的狀態(tài)。您保持的狀態(tài)信息應(yīng)該盡可能少,但同時(shí)又足夠使應(yīng)用程序恢復(fù)到恰當(dāng)?shù)狞c(diǎn)。您不必一定要顯示用戶上次退出時(shí)操作的頁(yè)面,如果那樣做并不合理的話。比如,如果一個(gè)用戶在編輯某個(gè)聯(lián)系人的時(shí)候離開(kāi)了Phone程序,那么在下次運(yùn)行時(shí),Phone程序顯示的是聯(lián)系人的頂級(jí)列表,而不是該聯(lián)系人的編輯屏幕。

大小寫(xiě)敏感性

iPhone OS設(shè)備的文件系統(tǒng)是大小寫(xiě)敏感的。在處理文件名的任何時(shí)候,您都應(yīng)該確保大小寫(xiě)準(zhǔn)確匹配,否則可能不能打開(kāi)或訪問(wèn)文件。

轉(zhuǎn)載于:https://www.cnblogs.com/Camier-myNiuer/p/3381317.html

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的iOS 文件和数据管理 (可能会删除本地文件储存)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。