寫這篇文章的原因是當初公司要求作技術分享,選擇了這個框架。CoreData框架雖然是官方出品,但其各類概念和存在的細節問題使得學習成本較高,相比較libsqlite和FMDB而言也顯得較爲笨重。此外通常開發也都習慣了寫sql語句。因爲以上的緣由,因此通常持久化方案較少使用CoreData。
可是,因爲Xcode內置和其良好的封裝性,咱們只需幾步就能夠很容易的創建起持久化方案,良好的優化也讓咱們能夠徹底不用顧忌與sqlite交互會存在問題,此外CoreData還有不少例如數據遷移等強大的功能。因此仍是有必要去了解學習一下。html
本篇文章分爲4個章節:git
- (一)基本概念與簡單使用
- (二)多線程方案
- (三)MagicalRecord的使用
- (四)數據遷移和其餘知識點
- 簡介
- 相關概念
- 如何在項目中接入
- 實現簡單CRUD
簡介:
Core Data是OS X 10.4 Tiger以後引入的一個持久化技術,經過與數據庫進行交互,將模型的狀態持久化到磁盤。
使用了對象-關係映射(ORM)技術,很好的將數據中的表和字段轉化爲對象和屬性,同時將表之間的關係轉化成了對象之間的包含關係。
咱們能夠輕易的操做這些對象實現增刪改查功能,而這些操做Core Data都已經幫咱們封裝好了,它能夠自動的將改變同步到數據庫中。
更易見的特色是它能夠進行可視化操做,咱們能夠經過可視化的界面很容易的的管理實體、屬性及實體關係等。github
優勢:sql
> 1. 封裝性好。不須要寫任何SQL語句,提供的api方法減小了模型層的代碼的編寫量。使用封裝類NSPredicate和NSFetchRequest結合進行查詢。 > 2. 優化性好。封裝類內部有優化機制,性能較好。如懶加載、處理寫入衝突等。 > 3. 可視化界面。Xcode提供可視化的界面,能夠方便的去管理實體和關係。 > 4. 支持多線程。NSManagedObjectContext類有提供相關api,方便進行多線程操做。 > 5. 功能強大。提供遷移(migration)和撤銷重作(undo/redo)等功能。
缺點:數據庫
> 1. 學習成本高。框架較爲笨重,概念多且較難理解。 > 2. 使用成本高。使用Core Data進行多線程操做須要作一些處理和優化。 > 3. 靈活性差。難以實現一些sql可以簡單實現的操做。好比多表鏈接查詢等。
Core Data各封裝類的關係圖以下:segmentfault
- Entity 實體
咱們知道,通常使用數據庫會建立各類表。好比用戶表User、商品表Goods等等。而實體Entity就對應數據庫中表的定義,實體、屬性、關係對應數據庫中的表、字段、關係。咱們能夠在.xcdatamodeld文件的可視化界面中建立一些實體,併爲其添加屬性和關係。api
- NSEntityDescription 實體描述對象
實體的封裝類,包含了實體的名字、屬性、關係等。安全
- NSManagedObjectModel 託管對象模型 (MOM)
既然咱們要操做數據庫,那麼就須要知道數據庫中全部的表和字段等,託管對象模型就保存了全部實體描述(NSEntityDescription)。它經過.mom或.momd文件(由.xcdatamodeld文件編譯後獲得)來進行實例化。多線程
- NSManagedObject 託管對象 (MO)
託管對象對應數據庫中某條記錄,CoreData爲每個MO設置了惟一的ID,以確保託管對象與數據庫記錄一一對應。咱們使用CoreData進行增刪改查就是須要在託管對象上進行操做。app
- NSManagedObjectContext 託管對象上下文 (MOC)
那麼咱們對託管對象的操做是如何同步到數據庫的呢?這就須要使用到託管對象上下文,MOC負責提交MO的改動。
- NSPersistentStoreCoordinator 持久化存儲協調器 (PSC)
MOC會將改動提交至PSC,由PSC負責對sqlite數據庫進行讀寫。CoreData在該層封裝上進行了優化,使得PSC對數據庫的操做是線程安全的,因此咱們能夠對PSC放心,無需關心它是如何操做數據庫。
整體來講,CoreData的封裝性很好,與數據庫相關的全部內容都對應有相應的模型或OC類,例如Entity、NSManagedObject類。
對於CoreData中的CRUD操做來講,MO很像巫毒娃娃同樣,因爲巫毒娃娃與人之間創建了某種聯繫,因此當咱們用針扎巫毒娃娃時,與其綁定的人會以爲痛。一樣的當咱們修改MO對象時,數據庫中與之對應的記錄就會改變,而MOC就充當這種聯繫。
使用sqlite和CoreData進行增刪改查的流程入下。
1. 項目建立時自動接入
新建項目時勾選「Use Core Data」便可
須要關注的是:
在AppDelegate.h中,看到多了三個成員屬性和兩個方法。Xcode爲咱們自動生成並進行了初始化。
iOS10以後變成了使用NSPersistentContainer類,能夠看下NSPersistentContainer類的聲明,其實它只是將MOM,PSC,MOC作了封裝,爲了方便初始化和使用。
同時目錄中也多出來一個與項目名稱相同的.xcdatamodeld文件
2. 手動接入
首先導入CoreData框架
爲了方便,建立了一個CoreDataManager類
.h
.m
1. 增
2. 刪
3. 改
4. 查
CoreData整理(二)——多線程方案
CoreData整理(三)——MagicalRecord的使用
CoreData整理(四)——數據遷移和其餘問題
Demo地址