ios 資料儲存方式

2021-07-14 12:51:27 字數 4711 閱讀 1218

今天發現一篇好文章,忍不住收藏下來

所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料。在ios開發中,有很多資料持久化的方案,接下來我將嘗試著介紹一下5種方案:

在介紹各種儲存方法之前,有必要說明以下沙盒機制。ios程式預設情況下只能訪問程式自己的目錄,這個目錄被稱為「沙盒」。

既然沙盒就是乙個資料夾,那就看看裡面有什麼吧。沙盒的目錄結構如下:

"應用程式包"

documents

library

caches

preferences

tmp

雖然沙盒中有這麼多資料夾,每個資料夾都有各自的特性。所以在選擇存放目錄時,一定要認真選擇適合的目錄。

plist檔案是將某些特定的類,通過xml檔案的方式儲存在目錄中。

可以被序列化的型別只有如下幾種:

nsarray;

nsmutablearray;

nsdictionary;

nsmutabledictionary;

nsdata;

nsmutabledata;

nsstring;

nsmutablestring;

nsnumber;

nsdate;

nsstring *path = nssearchpathfordirectoriesindomains(nsdocumentdirectory, nsuserdomainmask, yes).firstobject;
nsarray *array = @[@"123", @"456", @"789"];

[array writetofile:filename atomically:yes];

nsarray *result = [nsarray arraywithcontentsoffile:filename];

nslog(@"%@", result);

//1.獲得nsuserdefaults檔案

nsuserdefaults *userdefaults = [nsuserdefaults standarduserdefaults];

//2.向檔案中寫入內容

[userdefaults setobject:@"aaa" forkey:@"a"];

[userdefaults setbool:yes forkey:@"***"];

[userdefaults setinteger:21 forkey:@"age"];

立即同步

[userdefaults synchronize];

//3.讀取檔案

nsstring *name = [userdefaults objectforkey:@"a"];

bool *** = [userdefaults boolforkey:@"***"];

nsinteger age = [userdefaults integerforkey:@"age"];

nslog(@"%@, %d, %ld", name, ***, age);

歸檔在ios中是另一種形式的序列化,只要遵循了nscoding協議的物件都可以通過它實現序列化。由於決大多數支援儲存資料的foundation和cocoa touch類都遵循了nscoding協議,因此,對於大多數類來說,歸檔相對而言還是比較容易實現的。

nscoding協議宣告了兩個方法,這兩個方法都是必須實現的。乙個用來說明如何將物件編碼到歸檔中,另乙個說明如何進行解檔來獲取乙個新物件。

之前的所有儲存方法,都是覆蓋儲存。如果想要增加一條資料就必須把整個檔案讀出來,然後修改資料後再把整個內容覆蓋寫入檔案。所以它們都不適合儲存大量的內容。

表面上sqlite將資料分為以下幾種型別:

實際上sqlite是無型別的。即不管你在創表時指定的字段型別是什麼,儲存是依然可以儲存任意型別的資料。而且在創表時也可以不指定字段型別。sqlite之所以什麼型別就是為了良好的程式設計規範和方便開發人員交流,所以平時在使用時最好設定正確的字段型別!主鍵必須設定成integer

準備工作就是匯入依賴庫啦,在ios中要使用sqlite3,需要新增庫檔案:libsqlite3.dylib並匯入主標頭檔案,這是乙個c語言的庫,所以直接使用sqlite3還是比較麻煩的。

/**

* 從表中讀取資料到陣列中

*/- (void)readdata

self

.datalist = marray;

}sqlite3_finalize(stmt);

}

總得來說,sqlite3的使用還是比較麻煩的,因為都是些c語言的函式,理解起來有些困難。不過在一般開發過程中,使用的都是第三方開源庫fmdb,封裝了這些基本的c語言方法,使得我們在使用時更加容易理解,提高開發效率。

fmdb是ios平台的sqlite資料庫框架,它是以oc的方式封裝了sqlite的c語言api,它相對於cocoa自帶的c語言框架有如下的優點:

注:fmdb的github位址

fmdb有三個主要的類:

和c語言框架一樣,fmdb通過指定sqlite資料庫檔案路徑來建立fmdatabase物件,但fmdb更加容易理解,使用起來更容易,使用之前一樣需要匯入sqlite3.dylib。開啟資料庫方法如下:

fmdatabase *database = [fmdatabase databasewithpath:path];

if (![database open])

值得注意的是,path的值可以傳入以下三種情況:

在fmdb中,除查詢以外的所有操作,都稱為「更新」, 如:create、drop、insert、update、delete等操作,使用executeupdate:方法執行更新:

//常用方法有以下3種:   

- (bool)executeupdate:(nsstring*)sql, ...

- (bool)executeupdatewithformat:(nsstring*)format, ...

- (bool)executeupdate:(nsstring*)sql withargumentsinarray:(nsarray *)arguments

//示例

[database executeupdate:@"create

table

ifnot

exists t_person(id

integer primary key autoincrement, name

text, age integer)"];

//或者

[database executeupdate:@"

insert

into t_person(name, age) values(?, ?)", @"bourne", [nsnumber numberwithint:42]];

查詢方法也有3種,使用起來相當簡單:

- (fmresultset *)executequery:(nsstring*)sql, ...

- (fmresultset *)executequerywithformat:(nsstring*)format, ...

- (fmresultset *)executequery:(nsstring *)sql withargumentsinarray:(nsarray *)arguments

查詢示例:

//1.執行查詢

fmresultset *result = [database executequery:@"select * from t_person"];

//2.遍歷結果集

while ([result next])

在多個執行緒中同時使用乙個fmdatabase例項是不明智的。不要讓多個執行緒分享同乙個fmdatabase例項,它無法在多個執行緒中同時使用。 如果在多個執行緒中同時使用乙個fmdatabase例項,會造成資料混亂等問題。所以,請使用 fmdatabasequeue,它是執行緒安全的。以下是使用方法:

fmdatabasequeue *queue = [fmdatabasequeue databasequeuewithpath:apath];
[queue indatabase:^(fmdatabase *database)     

}];

而且可以輕鬆地把簡單任務包裝到事務裡:

[queue intransaction:^(fmdatabase *database, bool *rollback)    

//回滾

*rollback = yes;

}];

fmdatabasequeue 後台會建立系列化的g-c-d佇列,並執行你傳給g-c-d佇列的塊。這意味著 你從多執行緒同時呼叫呼叫方法,gdc也會按它接收的塊的順序來執行。

詳見我的另一篇筆記:我要娶你做我的coredata!

iOS中資料儲存方式

首先我們來了解一下ios中資料儲存有哪些方式 xml 屬性列表 plist 歸檔 plist 全名是 property list,屬性列表檔案。它是一種用來儲存序列化後的物件的檔案。屬性列表檔案的擴充套件名為 plist,因此通常被稱為 plist 檔案。檔案是 xml格式的。它是以 key val...

iOS 資料儲存方式介紹

ios常用資料儲存方式主要有5種 1 plist xml屬性列表歸檔 2 偏好設定 3 nskeyedarchiver歸檔 儲存自定義物件 4 sqlite3 資料庫,關係型資料庫,不能直接儲存物件,要編寫一些資料庫sqlite語句,我部落格裡有一篇文章關於sqlite3資料庫基本操作的 5 cor...

iOS本地資料儲存的方式

1 nskeyedarchiver 歸檔 採用歸檔的形式來儲存資料,可以實現對複雜物件的資料儲存,該資料物件需要遵守nscoding協議,並且該物件對應的類必須提供encodewithcoder 和initwithcoder 方法.2 nsuserdefaults 用來儲存應用程式設定和屬性 使用者...