ios 資料儲存--幾種資料持久化方案
所謂的持久化,就是將資料儲存到硬碟中,使得在應用程式或機器重啟後可以繼續訪問之前儲存的資料。在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 if not 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也會按它接收的塊的順序來執行。 iOS中的資料持久化方法
目前在ios開發中,實現資料持久化的方法主要由四種,分別為屬性列表 歸檔 資料庫 core data,下面我就給大家簡單介紹一下他們的用法 一 屬性列表 主要用到的類 nsuserdefaults 下面我建乙個user類 inte ce user nsobject nscoding 首先要遵守nsc...
iOS終端資料持久化
ios有很多資料持久化技術,包括傳統的資料庫,但也有一些較新的技術,它主要的持久化技術有 資料庫 屬性列表 物件歸檔和。本節將分別介紹這四種持久化方式,輔助本文在設計與實現中針對不同的需求選擇合適的資料持久化方式。資料庫技術被廣泛的使用在各大系統中,資料庫也是乙個系統的核心部分,資料庫管理系統如今發...
iOS 資料持久化 Plist
獲取plist檔案位址 nsstring path nsbundle mainbundle pathforresource people oftype plist 獲取plist檔案內容 乙個字典 nsdictionary dict nsdictionary dictionarywithconten...