今天發現一篇好文章,忍不住收藏下來
所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料。在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 用來儲存應用程式設定和屬性 使用者...