簡單的說,Core Data就是能夠存儲到磁盤的對象圖,[...]Core Data能夠幫咱們作不少任務做。它能夠做爲軟件的整個 模型層。它不單單在磁盤上存儲數據,也把咱們須要的數據對象讀取到內存中。 [1]——Marcus Zarra, Core Data
Core Data是Mac OS X中Cocoa API的一部分,首次在Mac OS X 10.4 Tiger與iOS 3.0系統中出現[2]。它容許按照實體-屬性-值模型組織數據,並以XML,二進制文件或SQLite數據文件的格式將其串行化。Core Data容許用戶使用表明實體和實體間關係的高層對象來操做數據。它也能夠管理串行化的數據,提供對象生存期管理與object graph管理,包括存儲。Core Data直接與SQLite交互,避免開發者使用本來的SQL語句[3]。php
就像Cocoa綁定在模型-視圖-控制器設計中作了不少控制器的工做同樣,Core Data作了不少數據模型的工做。它的主要任務是負責數據更改的管理,串行化到磁盤,最小化內存佔用,以及查詢數據。數據庫
Core Data使用包括實體和實體間關係,以及查找符合某些條件的實體的請求等內容的高層數據模型描述數據。開發者能夠在純對象層上查找與管理這些數據,二沒必要擔憂存儲和查找的實現細節。Interface Builder中的控制器對象能夠直接獲取與管理實體,若與Cocoa綁定結合,則能夠在不寫自定義代碼的狀況下讓用戶界面顯示、修改與管理數據模型中的大部份內容。多線程
例如:開發者但願開發一個管理vCard的程序。做者但願使用Core Data將一些vCard讀入對象中,而後把它們存入一個大XML文件中。開發者須要在Xcode中建立數據模型,而後到Interface Builder中加入Core Data Entity項以建立其數據模型對應的GUI。而後,開發者能夠加入標準的Objective-C代碼以讀取vCard,並將數據寫入由Core Data管理的實體中。在此,開發者的代碼是管理Core Data對象,而非其對應的vCard。最後,將Save
菜單項鍊接到控制器對象對應的方法上,使得控制器在接到存儲消息後自動的檢查數據堆棧,確認數據是否合法,最後利用當前更改重寫對應的Core Data文檔。在整個過程當中,開發者只須要專一於將vCard文件轉換爲Core Data實體的過程,而不需關心例如數據的顯示、合法性檢查、存儲等其它部分,提升了開發效率。iphone
Core Data is organized into a large hierarchy of classes, though interaction is only prevalent with a small set of them. Core Data由相對龐大的類繼承體系組成,但開發者須要關注的接口只是其中的一個相對小的子集。ide
類名 | 用途 | 關鍵方法 |
---|---|---|
NSManagedObject |
|
|
NSManagedObjectContext |
|
|
NSManagedObjectModel |
|
|
NSFetchRequest |
|
|
NSPersistentStoreCoordinator |
|
|
NSPredicate |
|
|
Core Data能夠將數據存儲爲XML,二進制文件或SQLite文件[3]。在Mac OS X 10.5 Leopard及之後的版本中,開發者也能夠經過繼承NSPersistentStore類以建立自定義的存儲格式。每種方法都有其優缺點,例如XML的可讀性,SQLite的節約空間等。Core Data的這一方面相似於原始的Enterprise Objects Framework(EOF)系統,但EOF中開發者可使用相對簡潔的查詢方式,而在Core Data中,只能使用一個語法相似SQL子集的查詢語言,稱爲Predicate[6]。ui
Core Data是標準化的,能夠自由的讀寫Xcode數據模型文件(一般是.xcdatamodel文件)。與EOF不一樣,Core Data目前沒有設計多用戶或多線程訪問模式。模型遷移一般也須要代碼,若其它開發者依賴於某個數據模型,則該數據模型的設計者可能在模型發生改變時須要 與新數據模型一塊兒提供版本轉換代碼。lua
Core Data的很大一部分設計都歸功於早期的NeXT產品,Enterprise Objects Framework(EOF)[7]。spa