iOS Swift4.0 CoreData(一)

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結(jié)構(gòu)圖.jpeg

從上圖可以看出,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)

Jietu20171116-114024.png

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


Jietu20171116-114105.png

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


Jietu20171116-115121.png

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


Jietu20171116-150259.png

Jietu20171116-150319.png

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


Jietu20171116-150644.png

Jietu20171116-150717.png

創(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ù)模型的上下文

再來復(fù)習(xí)一下這張圖:
CoreData結(jié)構(gòu)圖.jpeg

以下操作都在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ò)誤,歡迎指正,交流。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容