使用CoreData完成上班簽到小工具

非典型技術宅發表於2018-04-21

使用CoreData完成上班簽到小工具

之前在前兩篇裡面實現了一個十分簡陋的通訊錄,而且都是通過系統預設的方式建立的CoreData。可是實際中哪裡有那麼好的事情嘛,要是忘記在建立工程的時候勾選了下面這個圖怎麼辦?

image.png

難道我們要把工程刪除,再重新建立嘛?很多時候再開始工程的時候並特麼的不知道需要用到資料庫啊。更多的時候已經都開始敲程式碼了,連需求文件都還木有拿到手裡,PM只會輕輕的說一句:設計圖不是已經有了嘛,先畫UI吧。

所以,CoreData Stack是為了解決這個問題誕生的嘛?很遺憾,並不是。看了前面的兩篇文章之後,有木有覺得CoreData不怎麼好用,還挺麻煩的吶?這時候要祭出CoreData Stack的啦。

1. CoreData Stack的作用

其實這個東西在一篇的時候提到過,不信您看:Swift實踐:使用CoreData完成一個通訊錄儲存

一個基本的 Core Data 棧由四個主要部分組成:託管物件 (NSManagedObject),託管物件上下文 (NSManagedObjectContext),持久化儲存協調器 (NSPersistentStoreCoordinator),以及持久化儲存 (NSPersistentStore)。

CoreDataStack,是自定義的一個CoreData 的棧物件,可以通過它,初始化專案的CoreData,以及獲取到Context,對資料庫進行增刪改查等操作。

2.建立 CoreData Stack

非典型技術宅既然說了這貨有四部分組成,那我們們就一個一個來唄。艾瑪,因為發現文章會被抄襲,抄襲之後有些人還不署名,搞的只好在文章裡面內嵌入一些自己的名字。心酸~~~~

2.1 iOS9

在iOS9中,CoreData Stack的三個核心類是這樣的:

  • 管理物件上下文NSManagedObjectContext
  • 物件模型NSManagedObjectModel
  • 儲存排程器NSPersistentStoreCoordinator

這個時候儲存是在Documents中間。

2.2 iOS10之後

iOS10之後就有點不一樣了, 增加了一個叫做NSPersistentContainer的東西。這個玩意兒作用就是用來管理CoreData Stack,為了能夠讓大家用起來更爽、更簡單。

需要說明的是,NSPersistentContainer 一點都沒有向下相容的意思,完全不相容iOS9.0,如果非要在iOS9.0裡面使用,會直接閃退。

這個時候儲存是在Library->Application Support中。

2.3 來吧,開始建立吧

宅胖這麼懶,怎麼還可能再寫一個相容iOS9.0的吶,想太多了~~~哈哈!所以,俺們只寫iOS10.0以後的。寫到這個時候,連版本號都已經寫煩了。

  • Step1:搞一個NSPersistentContainer出來
  • Step2:建立CoreData Stack
  • Step3:別忘了還有一個NSManagedObjectContext
  • Step4:提供一個儲存資料的方法
  • Step5:最後別忘記了在AppDelegate.swift裡面應用一下,不然不是白搞了半天嘛

    lazy var storeContainer: NSPersistentContainer = {
       let container = NSPersistentContainer(name: self.modelName)

        container.loadPersistentStores(completionHandler: { (storeDescription, error) in
            if let error = error as NSError? {
                debugPrint("Unclear error\(error)")
            }
        })
        return container
    }()

    lazy var managedContext: NSManagedObjectContext = {
        return self.storeContainer.viewContext
    }()

    func saveContext() {
        guard managedContext.hasChanges else { return }

        do {
            try managedContext.save()
        } catch let error as NSError {
            debugPrint("Unclear error\(error)")
        }

    }

複製程式碼

3. 一對多的關係

CoreData中實體管理關係是有三種的:1V1,1VN,NVN。我們們之前的兩個例子都是1V1。但是這個跟生活中不符啊,不能什麼事情都是一對一啊,例如一夫一妻制,有的地方還是一妻多夫制吶,還有換妻換夫怎麼辦?政治不正確啊,非典型技術宅!!注意  例如一個人下了很多訂單,訂單裡面又包含了很多商品。

image.png

如圖所示,Relationships表示管理關係的名稱,Destination表示目標表的名字,Inverse表示反向關係。

前面兩個都比較好理解,Inverse需要稍微多說一點點。如果沒有反向關係,就選擇No Inverse,但是蘋果官方建議為了保證資料之間的一致性,最好設定反向關係。

image.png

4. 完成Demo,瞭解使用CoreData Stack

然後我們們搞個小型本地化純良心自覺單機版的打卡器。這個打卡器用來管理員工的每次打卡時間。可以增加、刪除打卡時間。

完成後的效果圖:

attentances.gif

思維導圖如下:

image.png

4. 補充:如果建立工程的時候遺忘了勾選使用CoreData怎麼辦

如果忘選了也沒有關係,建立一個新的Data Model檔案:

image.png

設定完資料庫之後,按照如下操作:

image.png

好啦,就會自動生成檔案啦。

有力氣的就在github上給個星星✨。給個贊也行。

麼麼噠~(~o ̄3 ̄)~ 愛你們~ 所有的原始碼都在這裡: https://github.com/Stanbai/CoreDataDemo.git

相關文章