學習iOS開發已經有一段時間了,因爲一直沒有系統的去從頭至尾的學,多半是到AppCoda上面找文章來看,因此當真正開始想要作一個小應用時,卻無從下手了。通過思考,感受上應該是因爲一直是看別人的教程,從頭至尾的跟下來,可是卻歷來沒有針對具體的細節進行思考的緣由。因此開始打算在iOS應用開發過程當中遇到的技術要點都深刻的學習一下,而後整理成筆記,發在博客園、開源中國一個Github倉庫當中。發在開源中國是由於感受開源中國的社交氛圍要好一些。至於單獨開一個Github倉庫,純粹是處於一種備份的目的。左右這兩個平臺都支持Markdown格式,因此也就沒所謂了。html
筆記中所涉及的圖片,大都來自每篇筆記最下面的參考文章當中。我將參考文章分爲了兩個類別,一個是在蘋果開發者庫中找到的教程,第二個是經過互聯網找到的各種博客文章。ios
每篇筆記發表以後,我還會根據在實際使用中的新的發現以及在網絡上看到的比較好的文章以後,整理出新的心獲得對應的筆記當中。git
Core Data框架是用來管理數據在iOS應用當中的持久化操做的一種方式。其具備以下特性:github
注意:數據庫
- Core Data不是一個數據庫管理系統(RDBMS),其只是一個用於操做數據的持久化框架
- 使用Core Data,你仍然須要在真實的項目中編寫代碼以操做數據
- Core Data不依賴Cocoa綁定
從下圖可知,在CoreData框架中,咱們首先要建立一個持久化數據庫對象用於持久化數據的存儲,須要一個持久化存儲協調器,用於處理持久化庫對象與被管理對象上下文之間的操做。而後須要一個持久化上下文對象,在持久化上下文當中,包含了各類須要持久化的實體。數組
持久化上下文(NSManagedObjectContext):當咱們將數據從數據庫中提取出來後,將會放到持久化上下文當中,在持久化上下文中,咱們能夠對數據進行各類操做,可是這種操做在執行「保存」以前,是不會影響到數據庫中的原有數據的。網絡
被管理實體對象(NSManagedObject):數據模型對象在CoreData中被稱爲「被管理對象」。全部的被管理對象都須要被放置到一個持久化上下文當中,這樣纔可以使用上下文對被管理對象進行插入、刪除、修改等各類操做。持久化上下文將會監視對被管理對象的各類修改,這樣持久化上下文才可以對這些修改進行「撤銷」、「重作」以及「保存」等操做。app
當你決定將上下文中的全部改變都寫入數據庫時,CoreData將會檢測全部上下文中的數據對象的可用性,當全部的數據對象均可用時,將會將上下文中的修改都寫入到數據庫當中。框架
爲了使用持久化上下文從數據庫中提取數據,須要建立一個數據提取請求對象(NSFetchRequest),數據提取請求對象用於描述你須要從數據庫中提取怎樣的數據出來,相似於其餘ORM框架的查詢條件。數據提取請求對象包含三個部分:想要操做的被管理實體對象名稱,條件格式字符串(NSPredicate),條件數組(鍵值對)。以下圖所示:ide
將數據提取請求提交給持久化上下文,持久化上下文將從數據庫中提取出知足數據提取請求的數據,做爲被管理對象返回。提取返回的被管理對象將會自動加入接受請求的持久化上下文中,若是被提取的數據已經存在於持久化上下文當中,那麼直接從持久化上下文檔中返回這些符合提取請求條件的數據對象。
持久化存儲協調器(NSPersistentStoreCoordinator)以下圖所示,是用於處理被管理對象上下文(一個或多個)與數據庫(一個或多個)之間操做的。換句話說,在CoreData框架中,若是說最上層爲持久化上下文,最下層爲數據庫的話,持久化存儲協調器就是處於框架的中間層。
持久化存儲協調器其實是定義了一個棧。協調器被設計爲供上下文訪問的一個「面」,協調器將整合多個數據庫,這樣在上下文對象看來,就只有一個「數據庫」存在。全部在上下文中處理的數據對象,都來自協調器,不論這些數據是不是來自一個真實的數據庫。全部在上下文中對數據對象的處理,都將有協調器自動針對各個數據庫進行處理。
持久化存儲(NSPersistentStore)是對某一個外部數據存儲數據庫文件或其餘數據庫在應用程序內的映射,以即可以使用持久化上下文進行操做。通常狀況下,咱們須要對一個持久化存儲實例操做的,僅僅是指定其外部數據數據庫的位置,其餘的大部分有關數據持久化操做都是使用持久化上下文來進行的。
注意:
- 雖然CoreData支持對SQLite的持久化管理,可是CoreData沒法處理不是使用框架建立的SQLite數據庫,也就是說,CoreData只能處理和持久化本身建立的SQLite數據庫。
被管理對象模型(NSManagedObjectModel)提供用於描述被管理對象(NSManagedObject)綱要(Schema)。通常被管理對象模型可使用"Xcode Data Model Design"工具建立。
被管理對象模型是一個實體描述對象的集合,每個實體描述對象都是一個關於實體的元數據,包括實體名稱、在應用中使用的實體名稱(類實例變量/常量名)、實體屬性以及實體與其餘實體的關係。以下圖所示:
須要持久化的數據對象必須是NSManagedObject
類的實例,或這個類的子類的實例。被管理對象類使用一個私有的內部存儲來維護屬性和實現被管理對象各類所需的基礎行爲。一個被管理對象有一個到實體描述的索引。這個索引關聯到數據實體的元數據,包括實體名稱以及關於實體屬性和關係的描述信息。
注意:
- 能夠建立
NSManagedObject
的子類來豐富被管理對象的行爲。