Swift利用CoreData如何存儲(chǔ)多種數(shù)據(jù)類(lèi)的通訊錄
前言
我們?cè)?a target="_blank" href="http://chabaoo.cn/article/129752.htm">上一篇文章簡(jiǎn)單的實(shí)現(xiàn)了一個(gè)通訊錄,說(shuō)是通訊錄實(shí)際上就只是一個(gè)簡(jiǎn)簡(jiǎn)單單的Name List。這次我們要往這個(gè)通訊錄里面加入更多的元素,目的也是為了學(xué)習(xí)CoreData如何存儲(chǔ)更多的數(shù)據(jù)類(lèi)型。下面話不多說(shuō)了,來(lái)隨著小編一起看看詳細(xì)的介紹吧。
完成后的效果:
1. CoreData支持存儲(chǔ)數(shù)據(jù)類(lèi)型
咦?這里面有兩個(gè)好像很少看到的類(lèi)型:Binary Data、Decimal、Transformable。這些都是神馬東西?
1.1 Binary Data
顧名思義,就是二進(jìn)制數(shù)據(jù)。對(duì)應(yīng)到OC中就是NSData, Swift里面就是Data數(shù)據(jù)類(lèi)型。
我們這次就試試在通訊里面存儲(chǔ)一下圖片,把圖片變成Binary Data進(jìn)行存儲(chǔ)。
1.2 Decimal
Decimal為SQL Server、MySql等數(shù)據(jù)庫(kù)的一種數(shù)據(jù)類(lèi)型,不屬于浮點(diǎn)數(shù)類(lèi)型,可以在定義時(shí)劃定整數(shù)部分以及小數(shù)部分的位數(shù)。使用精確小數(shù)類(lèi)型不僅能夠保證數(shù)據(jù)計(jì)算更為精確,還可以節(jié)省儲(chǔ)存空間。
Decimal(n,m)表示數(shù)值中共有n位數(shù),其中整數(shù)n-m位,小數(shù)m位。例:decimal(10,6),數(shù)值中共有10位數(shù),其中整數(shù)占4位,小數(shù)占6位。
問(wèn)題來(lái)了,Decimal(2,1):
1, 插入數(shù)據(jù)“12”會(huì)怎樣?
會(huì)出現(xiàn)數(shù)據(jù)移除的錯(cuò)誤。
2, 插入”1.2345“會(huì)怎樣?
會(huì)自動(dòng)四舍五入成1.2
3, 插入2,會(huì)怎樣?
會(huì)自動(dòng)補(bǔ)充成2.0,以確保2位的有效長(zhǎng)度和1位的小數(shù)。
1.3 Transformable
這個(gè)類(lèi)型就比較搞了,有人說(shuō)它是萬(wàn)能類(lèi)型,有人說(shuō)它只要是對(duì)象就都可以。
在官方文檔里面,Core Data Release Notes for OS X v10.5 是這么介紹的:
Transformable Attributes
There's a new "transformable" type for NSManagedObject attributes that allows you more easily support attribute types that Core Data doesn't support natively. You access an attribute as a non-standard type, but behind the scenes Core Data uses an instance of NSValueTransformer to convert the attribute to and from an instance of NSData. Core Data then stores the data instance to the persistent store.
If you don't specify a transformer, transformable attributes to use keyed archiving (NSKeyedUnarchiveFromDataTransformerName).
For more details, see Non-Standard Persistent Attributes.
說(shuō)到底,這是一個(gè)非標(biāo)準(zhǔn)的類(lèi)型。在中文中,非典型技術(shù)宅胖其實(shí)覺(jué)得翻譯成“其他”類(lèi)型更貼切。哈哈~~就和有關(guān)部門(mén)一樣d=====( ̄▽?zhuān)?)b厲害。
有一點(diǎn)點(diǎn)小小需要注意的地方就是,數(shù)據(jù)類(lèi)型要遵守NSCoding協(xié)議。只要遵守了,就可以使用這個(gè)厲害的存儲(chǔ)類(lèi)型了。
來(lái)來(lái)來(lái),舉幾個(gè)栗子。Dictionary、Array、Number等等都可以呀。。。
感情是個(gè)萬(wàn)金油類(lèi)型!!
2. 使用CoreData存儲(chǔ)多種數(shù)據(jù)類(lèi)的通訊錄
我們?cè)谶@里計(jì)劃存儲(chǔ)的類(lèi)型有Data、Bool、String、Date、Int64。
2.1 CoreData的基本讀取操作
2. 1.1 獲取CoreData已經(jīng)保存數(shù)據(jù)的五個(gè)步驟
- 獲取總代理和托管對(duì)象總管
- 從Entity獲取一個(gè)fetchRequest
- 根據(jù)fetchRequest,從managedContext中查詢數(shù)據(jù)
- 保存。保存過(guò)程中可能會(huì)出錯(cuò),要做一下處理。
- 添加到數(shù)組中
2.1.2 基本存儲(chǔ)
- 獲取總代理和托管對(duì)象總管
- 建立一個(gè)Entity
- 保存內(nèi)容
- 保存Entity到托管對(duì)象。如果保存失敗,進(jìn)行處理
- 保存到數(shù)組中,更新UI
2.2 多種類(lèi)型的存儲(chǔ)
let imgData = from.value(forKey: "avatar") as? Data let isRelative = from.value(forKey: "isRelative") as? Bool let name = from.value(forKey: "name") as? String let updateTime = from.value(forKey: "updateTime") as? Date let viewTimes = from.value(forKey: "viewTimes") as? Int64 let mobile = from.value(forKey: "mobile") as? String
來(lái)來(lái)來(lái),就這樣輕松easy的把各種類(lèi)型的都轉(zhuǎn)換好啦~ 然后就可以存入進(jìn)去了吶。
3. Codable
咱們通訊錄里面通常的做法都會(huì)把一個(gè)用戶的信息全部放在一個(gè)Model里面,然后只需要把Model存儲(chǔ)到庫(kù)里面就好了。這個(gè)怎么做呢?
在OC時(shí)代,當(dāng)需要將一個(gè)對(duì)象持久化時(shí),需要把這個(gè)對(duì)象序列化,往常的做法是實(shí)現(xiàn) NSCoding 協(xié)議。
寫(xiě)過(guò)的人應(yīng)該都知道實(shí)現(xiàn) NSCoding 協(xié)議的代碼寫(xiě)起來(lái)很痛苦,特別想哭,尤其是當(dāng)屬性非常多的時(shí)候。
于是乎,Swift 4 中引入了 Codable 幫我們解決了這個(gè)問(wèn)題。
struct User: Codable { var avatarImg: Data var isRelative: Bool var name: String var updateTime: Date var viewTimes: Int64 var mobile: String }
如果我們想把User 對(duì)象的實(shí)例持久化,只需要讓 User 遵守 Codable 協(xié)議即可,Language 中不用寫(xiě)別的代碼。這樣就可以直接把Userencode成JSON啦。
下一篇我們就不能再用Xcode創(chuàng)建自帶的CoreData來(lái)搞事情了,我們要自己搞一個(gè)CoreData Stack來(lái)實(shí)現(xiàn)管理。
所有的源代碼都在這里:
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à)值,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
swift實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器
這篇文章主要為大家詳細(xì)介紹了swift實(shí)現(xiàn)簡(jiǎn)單的計(jì)算器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-01-01Swift項(xiàng)目中利用SWRevealViewController實(shí)現(xiàn)側(cè)滑菜單
這篇文章主要介紹了Swift項(xiàng)目中利用SWRevealViewController實(shí)現(xiàn)側(cè)滑菜單,需要的朋友可以參考下2015-12-12Swift開(kāi)發(fā)應(yīng)用中如何更方便地使用顏色詳解
這篇文章主要給大家介紹了關(guān)于Swift開(kāi)發(fā)應(yīng)用中如何更方便地使用顏色的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2018-03-03Swift使用CoreData時(shí)遇到的一些填坑記錄
這篇文章主要給大家記錄了在Swift使用CoreData時(shí)遇到的一些坑,以及介紹了CoreData在Swift 3.0中的一點(diǎn)改變,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-12-12Swift 3.0將UILabel數(shù)字顏色設(shè)置為紅色的方法
這篇文章主要介紹了關(guān)于在Swift中將UILabel數(shù)字顏色設(shè)置為紅色的方法,文中給出了詳細(xì)的示例代碼,相信對(duì)大家具有一定的參考價(jià)值,需要的朋友們下面來(lái)一起看看吧。2017-03-03Ubuntu 16.04上安裝 Swift 3.0及問(wèn)題解答
本文給大家分享的是在Ubuntu系統(tǒng)中安裝 Swift 3.0的方法和步驟,以及安裝過(guò)程中有可能遇到的問(wèn)題的解答,這里推薦給小伙伴們,希望大家能夠喜歡2016-07-07