Swift利用CoreData實(shí)現(xiàn)一個(gè)上班簽到的小工具
前言
我們?cè)谥暗膬善锩鎸?shí)現(xiàn)了一個(gè)十分簡(jiǎn)陋的通訊錄,而且都是通過系統(tǒng)默認(rèn)的方式創(chuàng)建的CoreData。可是實(shí)際中哪里有那么好的事情嘛,要是忘記在創(chuàng)建工程的時(shí)候勾選了下面這個(gè)圖怎么辦?

難道我們要把工程刪除,再重新創(chuàng)建嘛?很多時(shí)候再開始工程的時(shí)候并特么的不知道需要用到數(shù)據(jù)庫(kù)啊。更多的時(shí)候已經(jīng)都開始敲代碼了,連需求文檔都還木有拿到手里,PM只會(huì)輕輕的說一句:設(shè)計(jì)圖不是已經(jīng)有了嘛,先畫UI吧。
所以,CoreData Stack是為了解決這個(gè)問題誕生的嘛?很遺憾,并不是??戳饲懊娴膬善恼轮?,有木有覺得CoreData不怎么好用,還挺麻煩的吶?這時(shí)候要祭出CoreData Stack的啦。
1. CoreData Stack的作用
其實(shí)這個(gè)東西在一篇的時(shí)候提到過,不信您看:Swift實(shí)踐:使用CoreData完成一個(gè)通訊錄存儲(chǔ)
一個(gè)基本的 Core Data 棧由四個(gè)主要部分組成:托管對(duì)象 (NSManagedObject),托管對(duì)象上下文 (NSManagedObjectContext),持久化存儲(chǔ)協(xié)調(diào)器 (NSPersistentStoreCoordinator),以及持久化存儲(chǔ) (NSPersistentStore)。
CoreDataStack,是自定義的一個(gè)CoreData 的棧對(duì)象,可以通過它,初始化項(xiàng)目的CoreData,以及獲取到Context,對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪改查等操作。
2.創(chuàng)建 CoreData Stack
非典型技術(shù)宅既然說了這貨有四部分組成,那咱們就一個(gè)一個(gè)來唄。艾瑪,因?yàn)榘l(fā)現(xiàn)文章會(huì)被抄襲,抄襲之后有些人還不署名,搞的只好在文章里面內(nèi)嵌入一些自己的名字。心酸~~~~
2.1 iOS9
在iOS9中,CoreData Stack的三個(gè)核心類是這樣的:
-管理對(duì)象上下文NSManagedObjectContext
- 對(duì)象模型NSManagedObjectModel
- 存儲(chǔ)調(diào)度器NSPersistentStoreCoordinator
這個(gè)時(shí)候存儲(chǔ)是在Documents中間。
2.2 iOS10之后
iOS10之后就有點(diǎn)不一樣了, 增加了一個(gè)叫做NSPersistentContainer的東西。這個(gè)玩意兒作用就是用來管理CoreData Stack,為了能夠讓大家用起來更爽、更簡(jiǎn)單。
需要說明的是,NSPersistentContainer 一點(diǎn)都沒有向下兼容的意思,完全不兼容iOS9.0,如果非要在iOS9.0里面使用,會(huì)直接閃退。
這個(gè)時(shí)候存儲(chǔ)是在Library->Application Support中。
2.3 來吧,開始創(chuàng)建吧
宅胖這么懶,怎么還可能再寫一個(gè)兼容iOS9.0的吶,想太多了~~~哈哈!所以,俺們只寫iOS10.0以后的。寫到這個(gè)時(shí)候,連版本號(hào)都已經(jīng)寫煩了。
- Step1:搞一個(gè)NSPersistentContainer出來
- Step2:創(chuàng)建CoreData Stack
- Step3:別忘了還有一個(gè)NSManagedObjectContext
- Step4:提供一個(gè)保存數(shù)據(jù)的方法
- Step5:最后別忘記了在AppDelegate.swift里面應(yīng)用一下,不然不是白搞了半天嘛
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. 一對(duì)多的關(guān)系
CoreData中實(shí)體管理關(guān)系是有三種的:1V1,1VN,NVN。咱們之前的兩個(gè)例子都是1V1。但是這個(gè)跟生活中不符啊,注意 例如一個(gè)人下了很多訂單,訂單里面又包含了很多商品。

如圖所示,Relationships表示管理關(guān)系的名稱,Destination表示目標(biāo)表的名字,Inverse表示反向關(guān)系。
前面兩個(gè)都比較好理解,Inverse需要稍微多說一點(diǎn)點(diǎn)。如果沒有反向關(guān)系,就選擇No Inverse,但是蘋果官方建議為了保證數(shù)據(jù)之間的一致性,最好設(shè)置反向關(guān)系。

4. 完成Demo,了解使用CoreData Stack
然后咱們搞個(gè)小型本地化純良心自覺單機(jī)版的打卡器。這個(gè)打卡器用來管理員工的每次打卡時(shí)間??梢栽黾印h除打卡時(shí)間。
完成后的效果圖:

思維導(dǎo)圖如下:

4. 補(bǔ)充:如果創(chuàng)建工程的時(shí)候遺忘了勾選使用CoreData怎么辦
如果忘選了也沒有關(guān)系,創(chuàng)建一個(gè)新的Data Model文件:

設(shè)置完數(shù)據(jù)庫(kù)之后,按照如下操作:

好啦,就會(huì)自動(dòng)生成文件啦。
所有的源代碼都在這里:
github地址:https://github.com/Stanbai/CoreDataDemo.git
源碼下載:http://xiazai.jb51.net/201712/yuanma/CoreDataDemo(jb51.net).rar
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Swift 5.1 之類型轉(zhuǎn)換與模式匹配的教程詳解
這篇文章主要介紹了Swift 5.1 之類型轉(zhuǎn)換與模式匹配的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-05-05
淺談Swift編程中switch與fallthrough語句的使用
這篇文章主要介紹了Swift編程中switch與fallthrough語句的使用,用于基本的流程控制,需要的朋友可以參考下2015-11-11
用Swift構(gòu)建一個(gè)簡(jiǎn)單的iOS郵件應(yīng)用的方法
這篇文章主要介紹了用Swift構(gòu)建一個(gè)簡(jiǎn)單的iOS郵件應(yīng)用的方法,包括查看和標(biāo)記已讀等基本的郵件應(yīng)用功能,需要的朋友可以參考下2015-07-07
swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼
正則表達(dá)式使用單個(gè)字符串來描述、匹配一系列符合某個(gè)句法規(guī)則的字符串。本文重點(diǎn)給大家介紹swift 3.0 正則表達(dá)式查找/替換字符的實(shí)現(xiàn)代碼,需要的朋友參考下吧2017-08-08
Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體
最近在學(xué)swift 3.0,主要看的是蘋果的官方文檔,這里只是根據(jù)自己看官方文檔的理解所做的一些記錄,不是完整的翻譯,希望也對(duì)你有所幫助。下面這篇文章主要介紹了Swift 3.0基礎(chǔ)學(xué)習(xí)之類與結(jié)構(gòu)體的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-03-03
Swift中通過疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法
這篇文章主要介紹了Swift中通過疊加UILabel實(shí)現(xiàn)混合進(jìn)度條的方法的相關(guān)資料,需要的朋友可以參考下2016-08-08

