**:
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...