- CoreData基礎
在CoreData中有一些常用的類,稱呼可能各不相同校坑。
NSPersistentStoreCoordinator(Persistent Store Coordinator)
穷遂,縮寫為PSC函匕。
NSManagedObjectContext(Managed Object Context)
,縮寫為MOC蚪黑。
NSManagedObjectModel(Managed Object Model)
盅惜,縮寫為MOM中剩。
NSManagedObject
及其子類,根據(jù)英文翻譯和其作用抒寂,稱之為托管對象结啼。
后綴名為.xcdatamodeld
的文件,因為存儲著所有實體的數(shù)據(jù)結構和表示屈芜,所以稱之為模型文件郊愧。
- CoreData基礎
CoreData
是蘋果推出的一個數(shù)據(jù)存儲框架。CoreData
提供了一種對象關系映射(ORM
)的存儲關系井佑,類似于Java
的hibernate框架属铁。CoreData
可以將OC
對象存儲到數(shù)據(jù)庫中,也可以將數(shù)據(jù)庫中的數(shù)據(jù)轉化為OC
對象躬翁,在這個過程中不需要手動編寫任何SQL
語句焦蘑,這是系統(tǒng)幫我們完成
CoreData
最大的優(yōu)勢就是使用過程中不需要編寫任何SQL語句,CoreData
封裝了數(shù)據(jù)庫的操作過程盒发,以及數(shù)據(jù)庫中數(shù)據(jù)和OC對象的轉換過程喇肋。所以在使用CoreData
的過程中,很多操作就像是對數(shù)據(jù)庫進行操作一樣迹辐,也有過濾條件、排序等操作甚侣。
這就相當于CoreData
完成了Model
層的大量工作明吩,例如Model
層的表示和持久化,有效的減少了開發(fā)的工作量殷费,使Model
層的設計更加面向對象印荔。
CoreData主要的幾個類
NSManagedObjectContext
托管對象上下文,進行數(shù)據(jù)操作時大多都是和這個類打交道详羡。
NSManagedObjectModel
托管對象模型仍律,一個托管對象模型關聯(lián)一個模型文件(.xcdatamodeld
),存儲著數(shù)據(jù)庫的數(shù)據(jù)結構实柠。
NSPersistentStoreCoordinator
持久化存儲協(xié)調器水泉,負責協(xié)調存儲區(qū)和上下文之間的關系。
NSManagedObject
托管對象類窒盐,所有CoreData
中的托管對象都必須繼承自當前類草则,根據(jù)實體創(chuàng)建托管對象類文件。
CoreData簡單創(chuàng)建流程
1.模型文件操作
1.1 創(chuàng)建模型文件蟹漓,后綴名為.xcdatamodeld
炕横。創(chuàng)建模型文件之后,可以在其內部進行添加實體等操作(用于表示數(shù)據(jù)庫文件的數(shù)據(jù)結構)
1.2 添加實體(表示數(shù)據(jù)庫文件中的表結構)葡粒,添加實體后需要通過實體份殿,來創(chuàng)建托管對象類文件膜钓。
1.3 添加屬性并設置類型,可以在屬性的右側面板中設置默認值等選項卿嘲。(每種數(shù)據(jù)類型設置選項是不同的)
1.4 創(chuàng)建獲取請求模板颂斜、設置配置模板等。
1.5 根據(jù)指定實體腔寡,創(chuàng)建托管對象類文件(基于NSManagedObject
的類文件)
2.實例化上下文對象
2.1 創(chuàng)建托管對象上下文(NSManagedObjectContext)
2.2 創(chuàng)建托管對象模型(NSManagedObjectModel
)
2.3 根據(jù)托管對象模型焚鲜,創(chuàng)建持久化存儲協(xié)調器(NSPersistentStoreCoordinator
)
2.4 關聯(lián)并創(chuàng)建本地數(shù)據(jù)庫文件,并返回持久化存儲對象(NSPersistentStore
)
2.5 將持久化存儲協(xié)調器賦值給托管對象上下文放前,完成基本創(chuàng)建忿磅。
下邊一張圖概括coreData之間的關系:
從圖中可以看出,這兩部分都是比較獨立的凭语,兩部分的交互由一個持久化存儲調度器(
NSPersistentStreCoordinator
)來控制葱她。上層NSManagedObjectContext
存儲的數(shù)據(jù)都是交給持久化調度器,由調度器調用具體的持久化存儲對象(NSPersistentStore
)來操作對應的數(shù)據(jù)庫文件似扔,NSPersistentStore
負責存儲的實現(xiàn)細節(jié)吨些。這樣就很好的將兩部分實現(xiàn)了分離。
CoreData
本質還是使用SQLite
進行存儲炒辉,并沒有另外提供加密功能豪墅,具體的數(shù)據(jù)加解密還需要自己完成。
之前聽其他人說CoreData
的執(zhí)行效率不如SQLite
高黔寇,這個如果深究的話偶器,確實CoreData
要比SQLite
效率差一些,只不過并沒有太大區(qū)別缝裤。CoreData
本質也是在底層執(zhí)行SQL
語句屏轰,只是CoreData
的SQL
語句執(zhí)行邏輯比較耗時,沒有手動編寫SQL
語句更加直接憋飞。我們可以將CoreData
的調試功能打開霎苗,具體看一下SQL
語句的執(zhí)行。
客戶端畢竟不是服務端榛做,不需要像服務器那樣大量的數(shù)據(jù)查詢唁盏,所以CoreData
是完全可以應對客戶端的查詢量的。如果從靈活性來說检眯,CoreData
確實沒有SQLite
的靈活性高升敲,一些SQLite
的復雜功能可能也不能實現(xiàn),但是就目前大多數(shù)項目來說轰传,CoreData
已經能夠滿足項目持久化需求了驴党。
導致執(zhí)行效率差異的原因還體現(xiàn)在對象轉換上,CoreData
在執(zhí)行SQL
語句的基礎上获茬,還多了一層將數(shù)據(jù)映射給托管對象的操作港庄,這樣得到的就是OC
的托管對象倔既,而SQLite
得到的則不是。如果給SQLite
執(zhí)行完成后鹏氧,也加一層創(chuàng)建托管對象并賦值的操作渤涌,這時候對比性能兩者的差距可能就會更小了