ios開發之資料的持久化儲存機制

2021-06-16 23:11:51 字數 4574 閱讀 6251

**:

ios中資料的持久化儲存這塊內容,類似於android中檔案的幾種常見的儲存方式。

對於資料的持久化儲存,ios中一般提供了4種不同的機制。

1.屬性列表

2.物件歸檔

3.資料庫儲存(sqlite3)

4.蘋果公司提供的永續性工具core data。

其實儲存的形式無非就這麼幾種,而我們還必須要關心的是,這些檔案會被放置在那個檔案下,然後如何讀取。 也就是說:ios上資料儲存,我們要了解的兩點,資料儲存格式(也就是儲存機制),資料儲存位置。

1》檔案如何儲存(如上面4點)

2》檔案儲存在**。

對於資料的操作,其實我們關心的是操作的速率。

就好比在adnroid中偏好儲存,資料庫儲存,io儲存一樣。

我就只好先看看書了。

一:應用檔案目錄

首先我們來看了解下ios資料儲存位置,因為只有知道位置路徑我們才能去讀取資料,而資料的持久化機制不過是針對操作速率來考慮的, 比如我們大致知道屬性列表(既鍵值對形式)的儲存速率應該高於資料庫高於io檔案流儲存。

我們在選擇用何種機制儲存資料,主要也是看資料的形式。

乙個ios應用安裝後大致會有如下資料夾及其對應路徑:

在mac上看模擬器中應用路徑:

你在finder中的home下可能找不到library這個目錄,因為貌似是影藏起來了(我這機器上是,在終端可以看到)。

最後那一竄的類似序列號的東西就是ios自動給應用生成的一組應用唯一識別碼最為了應用的home目錄名。

其下面就是上圖所示了。

書上對這些資料夾介紹:

document:應用程式將其資料儲存在這個資料夾下,基於nsuserdefaults的首選項的設定除外。

簡單理解是,基本上我們要操作的一些資料都是儲存在這個資料夾下面的

tips:這邊提下一點,對於ios系統這麼分配資料夾,是因為在裝置進行同步時,itunes有選擇性的來備份檔案。

比如我們可以猜到,tmp下的應該就不會備份了。

對於document資料夾目錄路徑的獲取,api提供了這麼一種方法:

nsarray *paths = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes);

nsstring *docpath = [paths objectatindex:0];

library:基於nsuserdefault首選項設定儲存在其下preferences資料夾中,簡單來說,這個資料夾一般你很少操作到。

書上對於這部分基本沒介紹。估計對於初級部分是跳過了。

tmp:應用臨時儲存檔案,當不需要時,應用負責刪除其下的檔案資料。

該檔案也提供了目錄獲取方法:

- (void)encodewithcoder:(nscoder *)acoder    

- (id)initwithcoder:(nscoder *)adecoder

returnself;

}

#pragma nscopying協議實現

- (id)copywithzone:(nszone *)zone

@end

- (void)encodewithcoder:(nscoder *)acoder    

- (id)initwithcoder:(nscoder *)adecoder

returnself;

}

#pragma nscopying協議實現

- (id)copywithzone:(nszone *)zone

@end

然後是對物件歸檔的讀取和寫入

//讀取歸檔檔案  

nsdata *data = [[nsmutabledataalloc] initwithcontentsoffile:myfile];

nskeyedunarchiver *unarchiver = [[nskeyedunarchiveralloc] initforreadingwithdata:data];

testobj * test = [unarchiver decodeobjectforkey:@"data"];

[unarchiver finishdecoding];

[data release];

[unarchiver release];

//寫入歸檔檔案

nsmutabledata *data1 = [[nsmutabledataalloc] init];

nskeyedarchiver *archiver = [[nskeyedarchiveralloc] initforwritingwithmutabledata:data1];

[archiver encodeobject:test forkey:@"data"];

[archiver finishencoding];

[data writetofile:myfile atomically:yes];

[data1 release];

[archiver release];

[test release];

但是問了下新同事,據說這個用到也是蠻少,至少他目前。

但是,我看了下,覺得這個和android 中parcelable 太尼瑪像似了

三.資料庫儲存

和android一樣,ios中也是用了sqlite3這種嵌入式資料庫。

這個網上例子是很多了。我這邊就大致看下了資料庫的開啟, 資料庫表建立,查詢,插入

//資料庫操作  

sqlite3 *database;

// const nsstring * dbname = @"mydb"

int result;

//開啟乙個指定路徑的現有的資料庫,如果沒有則會新建乙個db庫

result = sqlite3_open([myfile utf8string], &database);

if (result != sqlite_ok)

//建立乙個db表

char *errormsg;

nsstring *sql_create_table = @"create table if not exists nonotable 省略~~~~~~~~~~~~~";

int result1 ;

//sqlite_exec用了針對sqlite3執行任何不要返回資料的命令,它用於執行更新,插入和刪除。簡單來說,這個方法執行的都是一些無需返回資料(雖然我們可能獲取乙個狀態值。)。

result1 = sqlite3_exec(database, [sql_create_table utf8string], null, null, &errormsg); 

//檢索查詢操作

int result2 ;

sqlite3_stmt *statment;

nsstring *sql_selected = @"查詢語句";

result2 = sqlite3_prepare_v2(database, [sql_selected utf8string], -1, &statment, nil);

if(result2 == sqlite_ok)

sqlite3_finalize(statment);

}

//繫結變數,既就是插入操作的一種變種,比如我麼那上面提到sqlite_exec可以執行插入操作,插入內容直接是寫在sql字竄裡,但是考慮到字竄涉及到無效的符號以及會一些嚴重的注入漏洞(比如以前聽過的引號符號)。

nsstring *sql_bind = @"insert into foo value(?,?)";  

result2 = sqlite3_prepare_v2(database, [sql_selected utf8string], -1, &statment, nil);

if(result2 == sqlite_ok)

if (sqlite3_step(statment) != sqlite_done)

nslog(@"error");

sqlite3_finalize(statment);

sqlite3_close(database);

四、core data儲存機制

大致瀏覽下基本感覺就是將物件歸檔搞成了視覺化和簡單化。 這塊內容比較多。網上資料也挺豐富的。 暫時不做介紹了。

總結下:其實對於ios資料儲存,最常用和主要要掌握的就是屬性列表和資料庫,因為兩個是出鏡率比較高的。 其他可能在資料存明顯體現出儲優勢時,我們會去考慮用另外兩種機制。 基礎的來說,必須掌握屬性列表和sqlite的操作儲存。

IOS開發 資料持久化篇之檔案儲存 二

前言 個人覺得開發人員最大的悲哀莫過於懂得使用卻不明白其中的原理.在 之前我覺得還是有必要簡單闡述下相關的一些知識點.因為文章或深或淺總有適合的人群.若有朋友發現了其中不正確的觀點還望多多指出,不勝感激.承接上篇部落格我們來看看ios開發中是如何將乙個自定義的物件進行歸檔的 本篇部落格將介紹以下幾個...

iOS開發 資料持久化 歸檔

在ios開發過程中,很多時候都需要進行一些資料的儲存和讀入,在資料量不大的情況下,使用plist儲存資料是一種很方便的方式,但是plist只能允許儲存一些系統自帶的資料型別,如果需要儲存自定義的資料型別,plist是是用不了的,但是可以使用另外一種資料持久化的方法 物件歸檔。nscoding協議 要...

IOS 本地儲存 資料持久化

沙盒 其實對於每乙個應用程式,都有唯一的乙個本地檔案與之對應,名字由系統隨機生成.這個檔案就是沙盒 沙盒機制 沙盒機制其實就是,對每乙個應用程式的資源起到乙個保護作用,當前程式不允許訪問其他程式的資源,其他程式也不允許訪問當前程式的資源.對於每乙個 應用程式的沙盒檔案中都包含以下檔案 1.docum...