介紹
在cocoa環境下,如果你想使用資料庫(如sqlite),你可以使用sql語句的方式通過相關的工具類進行資料庫的直接操作。當然你也可以通過別人封裝之後的一些簡單框架,使得你的操作更加簡單(如fmdb
bnrpersistence)。
cocoa框架本身提供了coredata這個api可方便的讓開發者通過操作物件的方式在運算元據庫。coredata是乙個物件圖(object graph)以及持久化的管理框架。我們可以通過coredata創物件,設定好象之間的關係,然後將其持久化(我們甚至可以使用記憶體資料庫),或者從硬碟上將持久化後的資料載入到記憶體中。物件圖,我們可以建立乙個個的物件,並維持不同物件之間的關係,一對一,一對多等。
coredata有大量的特性,諸如支援redo,undo的功能,這些很多document based的程式中顯得非常的有用。提供資料model結構變化輕量級的遷移方案。coredata還通過binding特性和控制項的緊密結合,這樣使得只需要少量的**便可以完成強大的功能,下面是乙個例子
儲存方式
core data可以將資料儲存為xml,二進位制檔案或sqlite檔案。在mac os x 10.5 leopard及以後的版本中,開發者也可以通過繼承nspersistentstore類以建立自定義的儲存格式。每種方法都有其優缺點,例如xml的可讀性,sqlite的節約空間等。
core data的這一方面類似於原始的enterprise objects framework(eof)系統,但eof中開發者可以使用相對簡潔的查詢方式,而在core data中,只能使用乙個語法類似sql子集的查詢語言,稱為predicate。core data是標準化的,可以自由的讀寫xcode資料模型檔案(通常是.xcdatamodel檔案)。
與eof不同,core data目前沒有設計多使用者或多執行緒訪問模式。模型遷移通常也需要**,若其它開發者依賴於某個資料模型,則該資料模型的設計者可能在模型發生改變時需要與新資料模型一起提供版本轉換**。
操作簡介
core data由相對龐大的類繼承體系組成,但開發者需要關注的介面只是其中的乙個相對小的子集。
一般需要定義以下core data的三個必備
nspersistentstorecoordinator *persistentstorecoordinator;
nsmanagedobjectmodel *managedobjectmodel;
nsmanagedobjectcontext *managedobjectcontext;
以及使用時需要用到的
nsfetchedresultscontroller *fetchedresultscontroller;
具體的使用例子比較多,後面介紹一下在使用過程中遇到的一些問題。或許可以幫到你。
分享1. 使用table時在3.0版本時會crash
- (nsinteger)tableview:(uitableview *)table numberofrowsinsection:(nsinteger)section
- (nsinteger)numberofsectionsintableview:(uitableview *)tableview
2. 又crash了,檢查一下,記得在所有增刪改查前已經呼叫過下面這幾句話,並且在重置fetchedresultscontroller 的時候也要重新呼叫,所以我把它寫到建立的尾部了。
nserror *error;
if (![fetchedresultscontroller performfetch:&error])
nslog(@"error performing fetch: %@", [error localizeddescription]);
3. 錯誤資訊看不懂,用
- (void) handleerror:(nserror *)error fromsource:(nsstring *)sourcestring
打出來的確實不是很清楚。有時候還是不準確不完整的資訊。換乙個吧,我們自己來。
+ (void) dumperror:(nserror *) error
}else
}4. 不是每次都要fetchedresultscontroller的,有時候直接用nsfetchrequest更方便。
nsfetchrequest *request = [[[nsfetchrequest alloc] init] autorelease];
nsentitydescription *tagentity = [nsentitydescription entityforname:@"entityname"inmanagedobjectcontext:managedobjectcontext];
[request setentity:tagentity];
nserror *error = nil;
nsarray *array = [managedobjectcontext executefetchrequest:request error:&error];
return [array count];
5. 有時候沒sql命令確實效率不怎麼樣。為了做乙個更新資料庫的操作,瞧這**,幸虧n都是很小的值。
nsmutablearray* persistent = [nsmutablearray arraywitharray:local];
nsmutablearray* netdata = [nsmutablearray arraywitharray:netreturn];
for(id info in persistent)
}if(!found)
}for(id data in netdata)
最後是儲存等操作
}6. 在使用的過程中,其功能強大省去了很多的事情,但是其實有很多需要注意的東西嗎,delegate的處理等等。在改變模型的時候如果沒有更新方案的話會很麻煩的。效率上也是值得商榷,還有一堆高度重複的**也是看起來不舒服的地方。還有就是感覺資料來源非常適合使用table來處理。
7. 在上面的第五點的更新操作為什麼需要這樣子麻煩呢,因為需要避免使用者在操作乙個資料庫中乙個已經被刪除的但是已經載到記憶體中物件。但是這種情況並沒有能夠完全規避,這時候在訪問物件資料前,需要及時的判斷這個記憶體中的物件還有效嗎。呼叫物件的isfault(nsmanagedobject),進行判斷,及時避免不必要的操作和崩潰。
附1. 是否該用 core data。在ios上使用資料庫的一點不同的聲音。
CoreData程式設計開始
1 資料持久化 persistent 2 coredata並不是唯一的資料儲存選項 3 coredata隱藏了許多複雜的資料儲存操作,讓你可以專注於你應用的娛樂和功能 4 雖然coredata可以儲存資料在相關的資料庫中 比如sqlite 但它並不是乙個資料引擎 database engine 5 ...
Posix執行緒程式設計指南 2
概念及作用 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問,比如程式可能需要每個執行緒維護乙個鍊錶,...
Posix執行緒程式設計指南 2
概念及作用 在單執行緒程式中,我們經常要用到 全域性變數 以實現多個函式間共享資料。在多執行緒環境下,由於資料空間是共享的,因此全域性變數也為所有執行緒所共有。但有時應用程式設計中有必要提供執行緒私有的全域性變數,僅在某個執行緒中有效,但卻可以跨多個函式訪問,比如程式可能需要每個執行緒維護乙個鍊錶,...