Swift實踐:使用CoreData存儲多種數據類的通信錄

Snip20171107_2.png

上一篇文章簡單的實現了一個通信錄,說是通信錄實際上就只是一個簡簡單單的Name List。此次咱們要往這個通信錄裏面加入更多的元素,目的也是爲了學習CoreData如何存儲更多的數據類型。git

完成後的效果: github

contact.gif

1. CoreData支持存儲數據類型

image.png

咦?這裏面有兩個好像不多看到的類型:Binary Data、Decimal、Transformable。這些都是神馬東西?數據庫

1.1 Binary Data

顧名思義,就是二進制數據。對應到OC中就是NSData, Swift裏面就是Data數據類型。數組

咱們此次就試試在通信裏面存儲一下圖片,把圖片變成Binary Data進行存儲。bash

1.2 Decimal

Decimal爲SQL Server、MySql等數據庫的一種數據類型,不屬於浮點數類型,能夠在定義時劃定整數部分以及小數部分的位數。使用精確小數類型不只可以保證數據計算更爲精確,還能夠節省儲存空間。app

Decimal(n,m)表示數值中共有n位數,其中整數n-m位,小數m位。例:decimal(10,6),數值中共有10位數,其中整數佔4位,小數佔6位。學習

問題來了,Decimal(2,1): 1, 插入數據「12」會怎樣?fetch

  • 會出現數據移除的錯誤。

2, 插入」1.2345「會怎樣?ui

  • 會自動四捨五入成1.2

3, 插入2,會怎樣?spa

  • 會自動補充成2.0,以確保2位的有效長度和1位的小數。

1.3 Transformable

這個類型就比較搞了,有人說它是萬能類型,有人說它只要是對象就均可以。

在官方文檔裏面,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.

說到底,這是一個非標準的類型。在中文中,非典型技術宅胖其實以爲翻譯成「其餘」類型更貼切。哈哈~~就和有關部門同樣d=====( ̄▽ ̄*)b厲害。

有一點點小小須要注意的地方就是,數據類型要遵照NSCoding協議。只要遵照了,就能夠使用這個厲害的存儲類型了。

來來來,舉幾個栗子。Dictionary、Array、Number等等均可以呀。。。

感情是個萬金油類型!!

2. 使用CoreData存儲多種數據類的通信錄

咱們在這裏計劃存儲的類型有Data、Bool、String、Date、Int64。

image.png

2.1 CoreData的基本讀取操做

2. 1.1 獲取CoreData已經保存數據的五個步驟

  1. 獲取總代理和託管對象總管
  2. 從Entity獲取一個fetchRequest
  3. 根據fetchRequest,從managedContext中查詢數據
  4. 保存。保存過程當中可能會出錯,要作一下處理。
  5. 添加到數組中

2.1.2 基本存儲

  1. 獲取總代理和託管對象總管
  2. 創建一個Entity
  3. 保存內容
  4. 保存Entity到託管對象。若是保存失敗,進行處理
  5. 保存到數組中,更新UI

2.2 多種類型的存儲

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
複製代碼

來來來,就這樣輕鬆easy的把各類類型的都轉換好啦~ 而後就能夠存入進去了吶。

3. Codable

我們通信錄裏面一般的作法都會把一個用戶的信息所有放在一個Model裏面,而後只須要把Model存儲到庫裏面就行了。這個怎麼作呢?

在OC時代,當須要將一個對象持久化時,須要把這個對象序列化,往常的作法是實現 NSCoding 協議。

寫過的人應該都知道實現 NSCoding 協議的代碼寫起來很痛苦,特別想哭,尤爲是當屬性很是多的時候。

因而乎,Swift 4 中引入了 Codable 幫咱們解決了這個問題。

struct User: Codable {
    var avatarImg: Data
    var isRelative: Bool
    var name: String
    var updateTime: Date
    var viewTimes: Int64
    var mobile: String     
}
複製代碼

若是咱們想把User 對象的實例持久化,只須要讓 User 遵照 Codable 協議便可,Language 中不用寫別的代碼。這樣就能夠直接把Userencode成JSON啦。

下一篇咱們就不能再用Xcode建立自帶的CoreData來搞事情了,咱們要本身搞一個CoreData Stack來實現管理。

全部的源代碼都在這裏: https://github.com/Stanbai/CoreDataDemo.git

相關文章
相關標籤/搜索