CoreData是蘋果在數(shù)據(jù)存儲(chǔ)的親生兒子,是在Cocoa平臺(tái)上管理數(shù)據(jù)層模型和數(shù)據(jù)持久化的要數(shù)據(jù)庫框架,近年swift的版本更新上基本都會(huì)有CoreData相關(guān)的更新,說明蘋果還是挺重視CoreData的;CoreData為我們提供了可視化的數(shù)據(jù)表結(jié)構(gòu),使得我們更加清晰地看到表與表(實(shí)體與實(shí)體)之間的關(guān)系,CoreData底層是基于SQLite數(shù)據(jù)庫的,使用CoreData管理應(yīng)用程序中的模型層對(duì)象。CoreData提供了與對(duì)象生命周期和對(duì)象圖管理相關(guān)聯(lián)的常見任務(wù)的通用和自動(dòng)化解決方案,包括持久性。
CoreData可以使我們更加容易的使用數(shù)據(jù)庫,因?yàn)椴恍枰覀兙帉懭魏蔚腟QL語句,CoreData底層為我們封裝好了模型層的大部分工作,這將有效的提升我們的工作效率,也使得數(shù)據(jù)庫操作更加地面向?qū)ο蟆?br>
雖然CoreData看起來很好,但是里面相關(guān)的概念比較多,想學(xué)好CoreData,必須先了解好這些概念以及它的存儲(chǔ)過程,先來看一個(gè)圖:

從上圖可以看出,CoreData主要分為兩部分,上層是模型層,模型層有NSManagedObjectContext上下文管理著,而底層則是由SQLite實(shí)現(xiàn)的持久化部分,通過NSPersistentStore和底層SQL數(shù)據(jù)庫交互,完成存儲(chǔ)過程。而這兩部分又是由NSPersistentStoreCoordinator持久化協(xié)調(diào)器關(guān)聯(lián)起來的,上層的存儲(chǔ)的數(shù)據(jù)交由持久化協(xié)調(diào)器,由協(xié)調(diào)器指定相關(guān)的NSPersistentStore進(jìn)行相關(guān)的數(shù)據(jù)庫存取操作。
使用CoreData要做的第一件事,就是要?jiǎng)?chuàng)建CoreData棧,在iOS 10開始,蘋果已經(jīng)為我們將CoreData棧封裝到一個(gè)叫NSPersistentContainer的對(duì)象里面,我們直接用就好了,但是,我覺得還是要一步一步自己創(chuàng)建CoreData棧,這樣做我們才能熟悉CoreData的存儲(chǔ)過程。
(1)創(chuàng)建一個(gè)新項(xiàng)目,同時(shí)勾選 “use Core Data” 選項(xiàng)

項(xiàng)目創(chuàng)建好,我們可以看到有一個(gè).xcdatamodeld文件,這個(gè)代表著數(shù)據(jù)庫文件結(jié)構(gòu)的文件

(2)然后點(diǎn)擊.xcdatamodeld文件,添加實(shí)體,修改實(shí)體名字(必須大寫字母開頭),為實(shí)體添加屬性(屬性必須以小寫字母開頭),右側(cè)面板可以設(shè)置屬性的默認(rèn)值,最大最小值等等屬性

對(duì)于每一個(gè)實(shí)體,build之后Xcode都會(huì)自動(dòng)幫我們生成相應(yīng)的實(shí)體類代碼,如果不想要自動(dòng)生成,可以選擇手動(dòng)生成,并且可以選擇手動(dòng)生成的語言


手動(dòng)生成實(shí)體類代碼的步驟:選擇xcdatamodeld文件-->editor-->create NSManagedObject SubClass,然后按提示點(diǎn)擊就行了。最終你會(huì)在項(xiàng)目文件里面看到新生成的實(shí)體類代碼文件


創(chuàng)建數(shù)據(jù)模型就是這幾個(gè)步驟了。
(3)接下來是創(chuàng)建CoreData棧了。
在那之前,先來認(rèn)識(shí)幾個(gè)對(duì)象:
NSManagedObject:數(shù)據(jù)模型(實(shí)體)的信息
NSPersistentCoordinator:模型層和持久化層的協(xié)調(diào)器
NSManagedObjectContext:內(nèi)存中數(shù)據(jù)模型的上下文

以下操作都在AppDelegate.swift文件中
創(chuàng)建NSManagedObjectModel對(duì)象(mom):
//managedObjectModel
lazy var managedObjectModel : NSManagedObjectModel {
guard let modelURL = Bundle.main.url(forResource: "CoreDataDemo", withExtension: "momd") else {
fatalError("failed to find data model")
}
guard let mom = NSManagedObjectModel(contentsOf: modelURL) else {
fatalError("Failed to create model from file: \(modelURL)")
}
return mom
}()
獲取文件URL要注意的是,文件名與建立的.xcdatamodeld文件名相同,但是擴(kuò)展名是“momd”,以為系統(tǒng)編譯后生成的文件擴(kuò)展名是.momd。
創(chuàng)建持久化協(xié)調(diào)器(psc):
lazy var persistanceCoordinator : NSPersistentStoreCoordinator = {
let psc = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
let dirURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last
let fileURL = URL(string: "db.sqlite", relativeTo: dirURL)
do {
try psc.addPersistentStore(ofType: NSSQLiteStoreType, configurationName: nil, at: fileURL, options: nil)
} catch {
fatalError("Error configuring persistent store: \(error)")
}
return psc
}()
持久化器是根據(jù)NSManagedObjectModel創(chuàng)建的,創(chuàng)建時(shí)指定數(shù)據(jù)庫創(chuàng)建的路徑。
創(chuàng)建模型文件管理上下文(moc):
lazy var managedObjectContext : NSManagedObjectContext = {
let moc = NSManagedObjectContext(concurrencyType:.mainQueueConcurrencyType)
moc.persistentStoreCoordinator = persistanceCoordinator
return moc
}()
創(chuàng)建上下文的時(shí)候要制定數(shù)據(jù)庫并發(fā)操作的類型,這個(gè)之后會(huì)詳細(xì)講,現(xiàn)在先設(shè)定為 mainQueueConcurrencyType ,最后,為上下文指定持久化器。
至此,CoreData棧的構(gòu)建就已經(jīng)完成,代碼以及CoreData的結(jié)構(gòu)圖都已經(jīng)給出,兩個(gè)對(duì)比一下其實(shí)很容易理解CoreData各部分的聯(lián)系。
這是CoreData的第一部分,后續(xù)還會(huì)有其他部分上傳上來。如有錯(cuò)誤,歡迎指正,交流。