原文出處: http://chengway.in/post/ji-zhu/core-data-by-tutorials-bi-ji
最近花了半個月讀完了Raywenderlich家的《Core Data by Tutorials》,接下來幾天就做個回顧,筆記并不是對原書的簡單翻譯,算是對整個知識脈絡的一個整理的過程吧:)
Update:?上周去搞Sketch了,工具算是基本入門了,抄了幾個圖標,畫了幾個圖,以后會再聊聊。好了,進入正題吧,今天打算介紹前三章,也是CoreData的最基礎的部分。***
第一章比較簡單,主要是帶你熟悉CoreData的用法,并用CoreData創(chuàng)建了一個簡單的List APP,學完這章你能加滿如下技能點:
第一章按順序大致如下:
作者提供了一個Start Project,打開其實就是一個UITableViewController,你需要做的就是增加一個addName方法,這里使用了UIAlertController這個iOS 8新添加的方法來做數(shù)據(jù)的添加邏輯,使用起來也很優(yōu)雅。
這個主要是根據(jù)你的數(shù)據(jù)模型創(chuàng)建對應的managed object model,主要操作也在.xcdatamodeld中進行,全GUI操作,沒什么難度。
You can think of a Core Data entity as a class “definition” and the managed object as an instance of that class.
這里作者用了面向對象的思想做了類比,雖然不是很準確,但也方便初學者理解。
這里要注意到NSManagedObject的“對象”其實是遵循“KVC”的,NSManagedObject對象的值改變后,在ManagedContext中進行save操作。
創(chuàng)建一個NSFetchRequest對象,設置好各種條件,依舊是交給ManagedContext對象去執(zhí)行。下面是作者描述了兩種fetch失敗的情況
If there are no objects that match the fetch request’s criteria, the method returns an optional value containing an empty array.
If an error occurred during the fetch, the method returns an optional value that contains nil. If this happens, you can inspect the NSError and respond appropriately.
第一章到此結束:)
NSManagedObject上一章我們提到過,要存取屬性,只能用KVC,使用起來既不安全也不符合面向對象的原則,所以我們這章要生成他的子類,來創(chuàng)建我們自己的屬性,這樣就又能愉快地使用"."語法啦。
第二章的大致順序如下:
作者提供了一個“挑選領結”的Start Project,領結數(shù)據(jù)存放在plist文件中,同樣是一個很簡單的App。
打開xcdatamodeld文件進行編輯,添加屬性。這里主要看一下Binary Data與Transformable兩種類型:
Binary Data這里將image對象保存成了二進制文件,當然任何可以序列化的對象其實都可以保存成二進制。這里作者強調了性能問題,如果將一個很大的二進制保存到SQLite數(shù)據(jù)庫中很可能會產(chǎn)生卡頓等問題。當然,幸運的是Core Data提供了一種叫Allows External Storage的解決方式,他只對binary data的屬性類型有效,你只需要簡單的開啟他就好了。
When you enable Allows External Storage, Core Data heuristically decides on a per-value basis if it should save the data directly in the database or store a URI that points to a separate file.
在Xcode中選擇Editor\Create NSManagedObject Subclass創(chuàng)建managedObject對象的子類,這里注意下Map Model中的attribute type與實際子類對象中的屬性的對應關系就好了
當然如果你想保留Map Model中的原始基本類型,那么在創(chuàng)建NSManagedObject Subclass時要勾選Use scalar properties for primitive data types
Similar to @dynamic in Objective-C, the @NSManaged attribute informs the Swift compiler that the backing store and implementation of a property will be provided at runtime instead of at compile time.
這里注意下兩種語言的一點區(qū)別
創(chuàng)建完子類還要記得一點就是在Model中的Attributes inspector將class name設為你新生成的子類路徑,完成這一步主要是為了在runtime時將managed object subclass與Model中的entity鏈接起來。(有點類似與在SB中創(chuàng)建一個VC,并設置他的custom class)。
因為Xcode默認的CoreData模板會將context在AppDelegate中創(chuàng)建,所以,就會有這種獲取context的做法:
let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate
但這種做法還是不推薦使用,較好的方法是能夠在對象的的初始化中將context作為參數(shù)進行傳遞。
接下來,作者從plist中將數(shù)據(jù)通過子類對象導入到core data中,再對界面做了些操作,這都比較簡單。
數(shù)據(jù)校驗這里可以在data model inspector 中設置最大最小值,如果出錯會在context save的時候將錯誤信息傳給error參數(shù)
第二章到此結束:)
Core Data要正常運行,需要幾個組件共同協(xié)作來完成,這些組件包括:
這些組件共同構成了Core Data Stack,組件間的關系我覺得用蘋果官方提供的一張圖來展示最好不過了
更多建議: