3dwoo大學簡體電腦書店
Core Data
( 簡體 字)
作者:Florian Kugler(佛羅萊恩·庫格勒),Daniel Eggert(丹尼爾·埃格特)類別:1. -> 程式設計 -> 綜合
出版社:電子工業出版社Core Data 3dWoo書號: 45135
詢問書籍請說出此書號!
有庫存
NT售價: 345
出版日:9/1/2016
頁數:252
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 字 )
ISBN:9787121294594 加入購物車加到我的最愛 (請先登入會員)
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證, 繁體書的下載亦請直接連絡出版社)
I Core Data基礎 1
第1章 初探Core Data 2
1.1 Core Data架構 2
1.2 數據建模 4
實體和屬性 5
托管對象子類 6
1.3 設置Core Data棧 7
1.4 顯示數據 9
獲取請求 11
Fetched Results Controller 13
1.5 操作數據 19
插入對象 19
刪除對象 22
1.6 總結 26
重點 26
第2章 關系 27
2.1 添加Country和Continent實體 27
子實體 31
2.2 創建關系 33
其他類型的關系 35
建立關系 36
關系和刪除 41
2.3 適配用戶界面 43
2.4 總結 48
重點 48
第3章 數據類型 49
3.1 標準數據類型 49
數值類型 49
日期 50
二進制數據 50
字符串 51
3.2 原始屬性和臨時屬性 51
原始屬性 51
臨時屬性 52
3.3 自定義數據類型 52
自定義值轉換器 52
自定義存取方法 56
3.4 默認值和可選值 59
3.5 總結 60
重點 60
II 理解Core Data 61
第4章 訪問數據 62
4.1 獲取請求 62
對象惰值 64
獲取請求的結果類型 67
批量獲取 69
異步獲取請求 70
4.2 關系 70
4.3 其他取回托管對象的方法 71
4.4 內存考量 72
托管對象及其上下文 72
關系的循環引用 73
4.5 總結 74
重點 74
第5章 更改和保存數據 76
5.1 變更追蹤 76
5.2 保存更改 78
驗證 80
保存沖突 82
5.3 批量更新 82
5.4 總結 84
重點 84
第6章 性能 86
6.1 Core Data棧的性能特質 86
詳解性能 87
6.2 避免獲取請求 89
關系 89
搜索特定的對象 91
類似單例的對象 93
小數據集 96
6.3 優化獲取請求 96
對象排序 96
避免多個、連續的惰值 97
批量獲取 98
Fetched Results Controller 99
關系預加載 99
索引 100
6.4 插入和修改對象 102
6.5 如何構建高效的數據模型 103
6.6 字符串和文本 106
6.7 獨家秘訣的可調參數 106
6.8 總結 107
III 并行和同步 109
第7章 與網絡服務同步 110
7.1 組織和設置 110
項目結構 111
7.2 同步架構 112
7.3 上下文屬主 113
線程、隊列和上下文 113
7.4 響應本地更改 115
7.5 響應遠程更改 119
7.6 更改處理器 119
上傳Moods 120
7.7 刪除本地對象 123
7.8 分組和保存更改 123
7.9 擴展同步架構 125
跟蹤每個屬性的更改 125
鏈接更改處理器 125
自定義網絡代碼 126
第8章 使用多個上下文 128
8.1 Core Data和并發 128
在不同的上下文之間傳遞對象 130
合并更改 132
8.2 Core Data棧 134
兩個上下文,一個協調器 134
兩個協調器 136
嵌套上下文的設置 137
8.3 總結 144
重點 145
第9章 使用多個上下文的問題 146
9.1 保存沖突 146
預定義的合并策略 147
自定義合并策略 148
9.2 刪除對象 153
兩步刪除法 154
傳播刪除 156
9.3 唯一性約束 157
9.4 總結 159
IV 進階話題 161
第10章 謂詞 162
10.1 一個簡單的例子 162
使用謂詞 163
10.2 用代碼來創建謂詞 164
10.3 格式字符串 165
比較 166
可選類型值 167
日期 168
10.4 合并多個謂詞 168
常量謂詞 170
10.5 遍歷關系 171
子查詢 171
10.6 匹配對象和對象ID 172
10.7 匹配字符串 173
字符串和索引 175
10.8 可轉換的值 175
10.9 性能和排序表達式 176
10.10 總結 177
第11章 文本 178
11.1 一些例子 178
11.2 搜索 179
字符串標準化 180
高效搜索 182
11.3 排序 183
一種簡單的方法 183
更新一個已排序的數組 184
持久化一個已排序的數組 188
11.4 總結 189
重點 189
第12章 數據模型版本以及遷移數據 190
12.1 數據模型版本 190
12.2 數據遷移的過程 192
自動數據遷移 193
手動數據遷移 194
12.3 推斷的映射模型 201
12.4 自定義映射模型 202
自定義實體映射策略 204
12.5 數據遷移和用戶界面 206
12.6 測試數據遷移 209
調試數據遷移時的輸出 210
12.7 總結 210
重點 211
第13章 性能分析 212
13.1 SQL調試輸出 212
獲取請求 213
填充惰值 217
保存數據 218
13.2 Core Data Instruments 219
13.3 線程保護 222
13.4 總結 222
第14章 關系型數據庫基礎和SQL 223
14.1 一個嵌入式數據庫 223
14.2 數據表、列以及行 224
14.3 數據庫系統的結構 225
查詢處理器 225
存儲管理器 226
事務管理器 226
數據和元數據 226
14.4 數據庫語言SQL 227
排序 228
14.5 關系 229
一對一關系 229
一對多關系 230
多對多關系 230
14.6 事務 231
14.7 索引 232
14.8 日志 232
14.9 總結 233
本書向讀者介紹使用Core Data時需要特別注意的事項,這將幫助讀者避開使用Core Data這個十分靈活且異常強大的框架時的一些陷阱。我們從一個簡單的應用例子開始,逐步將其擴展為包含關系、高級數據類型、并發、同步以及其他很多特性的完整例子,并在這個過程中對所有這些主題進行講解。在本書后半部分,我們還會超出這個基本應用所需要涉及的范圍,將知識點深入擴展到Core Data幕后的工作原理上。我們會學習如何獲取高性能、不同Core Data設置之間的權衡,以及如何對Core Data代碼進行調試和性能測試。本書所有的代碼都使用Swift編寫,我們也展示了如何將Swift的語言特性融入Core Data中,并寫出優雅和安全的代碼。我們希望讀者在閱讀本書的時候有一定的Swift和iOS開發基礎,不過相信不論是新人還是富有經驗的開發者,都能從本書中找到實用的信息和設計模式。

譯序

在 20 世紀 60 年代,導航式數據庫的概念隨著磁盤直接存取而發展起來;從 70 年代開始,
關系型數據庫登上歷史舞臺,它的概念一直延續至今。我們無法想象現代的計算機程序中
離開了數據庫會是怎樣的景象,數據庫技術已經成了這個世界方方面面的基石。
在數據管理和數據庫相關的方面,Apple給出的選擇是Core Data。正如在簡介中所提到的那
樣,Core Data其實并不是一個傳統意義上的數據庫,而是一套對象圖管理系統。這套系統
默認使用SQLite作為底層存儲,通過由低向高地將相關的管理組件構建為一個棧,來提供
緩存和對象管理機制。這讓我們對于數據對象的存儲和訪問都能夠高效而有序地進行。從
這一點上來說,Core Data與單純的數據庫相比,實在是強大得多。
但是能力越大,責任也越大。如果使用不當,那么Core Data不但不能為你提供良好的數據
存儲和訪問的性能,甚至會連最基本的操作都難以保證。在這種情況下,Core Data將不再
是你開發的助力,反而會成為掣肘。不幸的是,Core Data本身學習曲線比較陡峭,而涉及
的概念又非常多,所以真正想要精通Core Data并完全發揮它的效能并不是很容易的事情。
Apple在iOS的很多原生應用中大量使用了Core Data,比如照片、音樂和iBooks等,并且
事實證明它們都出色地完成了任務。在國外,也有很多開發者使用Core Data作為應用程序
的數據層和持久化的選擇。相比其他第三方的解決方案,Core Data不需要引入額外的框架,
也相對穩定可靠。但是在國內,現在使用這項技術的開發者較少,大家對Core Data的研究
也普遍沒有國外深入,這導致了提到Core Data很多人會不自覺地抗拒和躲避。將Core Data
的使用方法和最佳實踐以更容易理解的方式帶給國內開發者,促進大家接觸Core Data的架
構和思想,這正是我們選擇翻譯本書的目的。
本書的結構和閱讀方法在前言中會有所說明,這里就不再贅述了。需要補充的是,本書里
提供了大量的例子和相應的代碼,它們大多是需要進行權衡的選擇,并對應了不同的場景。
只有在你充分理解這些例子的含義后,你才可能在實際使用時做出正確的判斷。另外,Core
Data的靈活性是一把雙刃劍,當你選擇了更多的上下文以及協調器時,也意味著你為項目
引入了更多的復雜度。盡可能在能夠滿足需求的前提下,選擇最簡單的Core Data棧設置,
是高效、正確使用Core Data的關鍵。
本書原著的兩位作者有著多年的Core Data使用經驗。Florian Kugler是objc.io的聯合創始
人,曾經為objc.io撰寫了很多Core Data相關的文章,深受讀者喜愛。Daniel Eggert曾供職
于Apple,幫助Apple將照片應用遷移到Core Data框架內。他們的努力讓Core Data這個看
起來有些“可怕”的框架變得平易近人,借此我們可以一窺Core Data的究竟。不過不論是
原作者還是譯者,其實和各位讀者一樣,都只不過是普通開發者中的一員,所以本書出現
謬漏可能在所難免。如果你在閱讀時發現了問題,可以通過出版社聯系我們,我們將及時
研究并加以改進。
最后,祝你閱讀愉快。
徐 濤
錢世家
王 巍

前言

Core Data是Apple為iOS、OS X、watchOS和tvOS而設計的對象圖管理(object graph man-
agement)和數據持久化框架。如果你的App需要存儲結構化的數據,那么Core Data是一個
顯而易見的方案:它是現成的,Apple仍然在積極地維護它,而且它已經存在超過10年了。
Core Data是一個成熟、經過實踐檢驗的代碼庫。
然而 Core Data 最初會讓人有一些困惑:它非常靈活,但是 API 的最佳實踐卻并非顯而易
見。換句話說,本書的目標是幫助讀者快速入門Core Data。我們希望提供給讀者一系列包
括從簡單到高級的使用場景中的最佳實踐,這樣你可以充分利用Core Data的能力而又不會
迷失在一些不必要的復雜性中。
比如,Core Data經常被詬病難以在多線程環境中使用。其實Core Data的并發模型非常明確
和一致。如果正確使用,那么它可以幫助你避免許多并發編程中一些固有的陷阱。其他的
復雜性并不是由Core Data引入的,它們的根源其實是并發本身。我們會在第9章中對其進
行深入研究,另外我們還會實際演示一個后臺同步方案的例子。
除此之外,Core Data也經常被吐槽性能糟糕。如果你像使用關系型數據庫那樣來使用Core
Data,那么你會發現與直接使用類似SQLite這樣的數據庫相比,Core Data的性能開銷會很
高。但如果把 Core Data 當成一個對象圖管理系統來正確使用,那么得益于內建的緩存和
對象管理機制,它在很多方面實際上反而更快。此外,抽象級別更高的API可以讓你專注
于優化App里關鍵部分的性能,而不是從頭開始來實現如何持久化。在本書中,我們會介
紹保持Core Data高性能的最佳實踐,并在專門講性能以及性能分析的章節中探討如何解決
Core Data的性能問題。
本書使用Core Data的方式
本書展示了如何在實際例子中使用Core Data,而不僅僅是簡單地對API手冊進行一些擴展。
我們有意專注于完整例子的最佳實踐。根據我們的經驗,正確地組合使用Core Data的各個
部分往往是最大的挑戰。
此外,本書還深入解釋了Core Data內部的運作原理。了解Core Data這個靈活框架可以幫
助你做出正確的決定,同時能讓你的代碼保持簡單易懂。特別是當遇到并發和性能問題時,
這一點尤為重要。
示例代碼
你可以在GitHub上找到一個完整的示例程序的源代碼。我們在本書中很多地方都將用這
個示例程序來演示Core Data在較大的項目中面臨的挑戰和相應的解決方案。
請注意該示例程序代碼有時會和本書前面的一些章節中的示例程序有所不同。因為示例項
目是最終形態的完整的代碼,而本書前面章節中描述的是該示例程序早期、簡單階段的代碼。
結構
在本書的第一部分,我們會創建一個簡單版本的應用程序,來演示如何使用Core Data以及
Core Data的基本工作原理。即使早期的示例對讀者來說可能相當容易,但我們仍然建議讀
者瀏覽本書的這些部分,因為后面更復雜的例子是建立在前面介紹的最佳實踐和技術基礎
之上的。我們還想告訴你的是,即便在簡單的應用場景中,Core Data也會非常有用。
第二部分則著重深入介紹Core Data各個部分是如何一起協作的。我們會仔細探討當以不同
方式訪問數據時會發生什么,我們也會對插入或者操作數據時發生的情況進行研究。這部
分所覆蓋的內容會比寫一個簡單的Core Data應用程序所必要得多,這些方面的知識在處理
更大或更復雜的情況時可以派上用場。在此基礎上,我們將以性能方面的考量來對這個部
分進行總結。
第三部分從描述一個用來保持本地數據與網絡服務一致的通用同步架構開始,然后我們會
深入探討如何在Core Data中同時使用多個托管對象上下文(managed object context)。我們
提出設置Core Data棧的不同方案,并討論了它們的優缺點。在第9章里,介紹了如何應對
同時使用多個上下文帶來的額外復雜性。
第四部分涉及一些高級的主題,比如高級的謂詞(predicate)、搜索和文本排序、如何在不同
的數據模型版本之間遷移數據,以及分析Core Data棧的性能時所需要的工具和技術等。這
部分中有一章是從Core Data視角介紹有關關系數據庫和SQL查詢語言的基本知識的。如果
你不熟悉這些內容,那么這些章節能對你有所幫助,特別是可以讓你理解Core Data潛在的
性能問題,以及解決這些問題所需要的分析技術。
關于Swift的一些說明
貫穿本書,我們所有的示例都使用Swi編寫。我們擁抱Swi的語言特性——比如泛型、協議以及擴展——它們能讓我們更優雅、簡單、安全地使用Core Data的API。
用Swi表示的最佳實踐和設計模式同樣也適用于Objective-C的代碼。在實現上,由于語言上的不同,或許在某些方面會稍有不同,但是底層的原則是相通的。
可選值的約定
Swi提供了Optional數據類型,這迫使我們顯式地思考和處理沒有值的情況。我們非常喜
歡這個功能,所以我們在所有的例子里都使用了它。
因此我們盡量避免使用 Swi 的 ! 操作符來強制解包 (包括用它來定義隱式解包類型的用法),在我們看來這是一種壞代碼的味道,因為它破壞了我們使用可選值類型所帶來的類型安全。
唯一的例外是那些必須設置但又無法在初始化時設置的屬性。比如 Interface Builder 的
outlets或必要的代理(delegate)屬性等。在這些情況下,使用隱式解包的可選值符合“盡早
崩潰”原則:我們會立刻知曉這些必須要設置而又沒有正確設置的屬性。
錯誤處理的約定
Core Data中許多方法會拋出錯誤。基于它們是不同類型的錯誤這一基本事實,我們可以分
類處理這些錯誤。我們將區分邏輯錯誤和其他錯誤。
邏輯錯誤是指程序員犯錯的結果。它們應該從代碼層面上修復而不應該嘗試動態恢復程序
的運行。
舉一個例子,當你嘗試讀取應用程序包里的一個文件時,因為應用程序包是只讀的,那么
一個文件要么存在,要么不存在,而且它的內容永遠不會變。所以如果我們無法打開或者
解析應用程序包里的文件,那么這就是一個邏輯錯誤。
對于這些類型的錯誤,我們使用 Swi 的 try! 或 fatalError() 來盡可能早地讓應用程序
崩潰。
同樣的思想可以適用于 as! 操作符的強制類型轉換: 如果我們知道一個對象必須是某種類
型,轉換失敗的唯一原因會是邏輯錯誤,那么在這種時候我們實際上是希望應用程序崩
潰的。
很多時候我們用 Swi 的 guard 關鍵字來更好地表達哪些地方出錯了。例如 fetched results
controller返回的類型是NSManagedObject的對象,我們知道它必須是一個特定的子類,我
們使用guard來保證向下轉換,并在出錯的時候使用fatal error來中止程序:
func objectAtIndexPath(indexPath: NSIndexPath) -> Object {
guard let result = fetchedResultsController.objectAtIndexPath(indexPath)
as? Object else
{
fatalError("Unexpected object at (indexPath)")
}
return result
}
對于可恢復的非邏輯性錯誤,我們使用Swi的錯誤傳遞方法:拋出(throw)或者重新拋出
(rethrow)這些錯誤。

Florian
Daniel
pagetop