昨天,我們規劃好了 App 內部畫面的 Delegate 。但這樣又有新的問題:當「新增鬧鐘」畫面,將一個新的鬧鐘資訊回報給列表畫面後,這個鬧鐘該被存放在哪裡?
我們不能只把它存在一個暫時的變數裡,因為那樣 App 一關閉,所有的鬧鐘就都消失了。我們需要一個可以一直存放的空間,這樣App關閉後,資料還會存在。
困惑點:能不能把資料存成一個文字檔?我也聽過很多名詞,像 Apple 自家的 Core Data、SQLite,還有 Realm... 對於一個新手,該如何選擇?
AI 協作
我是一個 iOS 新手,需要為我的 App 儲存一些自定義的物件(例如鬧鐘)。請簡單比較 Core Data,SQLite 和 Realm 這三種儲存方式的優缺點,並給我一個新手入門的建議。
AI 的回答:
您好!身為 iOS 開發新手,選擇一個合適的資料儲存方案是非常重要的一步。針對您的需求——儲存自定義物件(如鬧鐘),比較 Core Data、SQLite 和 Realm 是非常經典的議題。
這三者代表了三種不同的抽象層級和開發哲學。以下我將為您詳細比較,並提供一個明確的新手入門建議。
優缺點分析
1. Core Data
- 想像它:像是 Apple 提供的一套全自動的倉儲管理系統。你只需要告訴系統你的「貨物(物件)」長什麼樣子,系統就會幫你處理進貨、出貨和庫存管理,但這套系統的操作手冊非常厚重。
- 優點:作為 Apple 的親兒子,它與作業系統的整合無懈可擊,特別是在處理 iCloud 同步這類複雜功能時。
- 缺點:對於新手來說,光是理解它的所有組件和運作原理就要花費大量時間,很容易在初期就感到挫折。
2. SQLite
- 想像它:像是一個空倉庫和一本 SQL 語法書。你需要親自設計貨架(
CREATE TABLE
)、親手將貨物一件件擺上架(INSERT
),並記下它們的位置,取貨時也要自己去翻找(SELECT
)。- 優點:給予你最大的自由度和控制力。全世界的開發者都懂 SQL,它是個通用的技能。
- 缺點:對於儲存「鬧鐘」這樣的物件,你需要手動把鬧鐘物件的各個屬性(時間、鈴聲、標籤)拆開,存入資料表的欄位中,讀取時再自己組合回物件。這個過程非常繁瑣且容易出錯。
3. Realm
- 想像它:像是一個專為現代化物流設計的智慧倉儲。你只需要定義好「鬧鐘」這個物件,Realm 就會自動幫你建立專屬的儲存空間。存取物件就像操作一個普通的 Swift class 一樣簡單直觀。
- 優點:API 設計非常友好,讓你感覺不像在操作資料庫,而是在操作 Swift 物件。它的「即時物件」特性意味著你查詢到的資料會自動更新,這在刷新 UI 時非常方便。
- 缺點:它是一個第三方框架,意味著你的專案會依賴它。但現今透過 Swift Package Manager (SPM) 管理依賴非常方便,這已不是一個大問題。
給新手的入門建議
結論先行:對於新手,我強烈推薦從
Realm
開始。理由如下:
- 學習曲線最平緩:您可以在最短的時間內學會如何儲存、讀取、更新和刪除您的自定義物件,從而將更多精力專注在 App 的功能和 UI 開發上。
- 程式碼更簡潔:相較於 Core Data 的大量設定和 SQLite 的手動 SQL,Realm 的程式碼非常直觀,大幅減少了樣板程式碼。
- 成就感更高:快速看到成果是學習程式設計時保持動力的關鍵。Realm 能讓您很快地實現物件儲存功能,帶來正向的反饋。
當您的 App 變得非常複雜,或需要與 Apple 生態系(如 iCloud)進行深度整合時,再回頭學習 Core Data 也不遲。屆時您已經有了資料庫操作的經驗,學習起來會更容易。
特性 / 方案 | Core Data | SQLite | Realm |
---|---|---|---|
基本概念 | Apple 官方的物件圖譜管理框架 (Object Graph Management Framework) | 一個輕量級的關聯式資料庫引擎 (SQL Database Engine) | 一個專為行動裝置設計的物件資料庫 (Object Database) |
抽象層級 | 高層級:操作 Swift/Objective-C 物件,框架會自動將其轉換並儲存。 | 低層級:直接編寫 SQL 語法來操作資料表 (Table) 與資料列 (Row)。 | 高層級:直接操作原生 Swift 物件,API 設計非常現代化。 |
上手難度 | 高:概念複雜(例如 NSManagedObjectContext , NSPersistentStoreCoordinator ),樣板程式碼 (Boilerplate) 較多。 |
中:需要熟悉 SQL 語法。在 Swift 中通常需要搭配第三方函式庫 (如 GRDB.swift, FMDB) 來簡化操作,否則會很繁瑣。 | 低:API 直觀易用,文件清晰,學習曲線最平緩。 |
與 Swift 整合度 | 良好:與 Xcode 編輯器深度整合,但 API 有時感覺不夠 "Swifty"。 | 低:原生是 C 語言 API。必須透過 Wrapper 函式庫才能與 Swift 良好協作。 | 極佳:API 設計完全遵循 Swift 風格,大量使用 Swift 的現代特性。 |
主要優點 | 1. Apple 原生,穩定性高。2. 與 iCloud 等系統服務整合度最高。3. 功能強大,適合處理複雜的物件關係。 | 1. 完全的控制權,可進行極致的效能優化。2. 跨平台標準,通用性強。3. 非常輕量。 | 1. 極易上手,開發速度快。2. 效能非常優異。3. 即時物件 (Live Objects) 特性,資料變更時 UI 可自動更新。 |
主要缺點 | 1. 學習曲線陡峭,對新手不友善。2. 除錯和多線程處理較複雜。 | 1. 需要手動編寫 SQL。2. 需要自行處理物件與資料庫表格之間的轉換 (ORM)。3. 樣板程式碼繁瑣。 | 1. 屬於第三方函式庫,需額外整合。2. 資料庫檔案 (.realm ) 有其專屬格式,不易從外部直接讀取。 |
我發現 Xcode 內建了一個很棒的工具叫做 Swift Package Manager (SPM),讓安裝外部工具這件事變得非常簡單。
我的安裝步驟:
在 Xcode 中,點擊頂部選單的 File
→ Add Packages Dependencies...
在右上角的搜尋框中,貼上 RealmSwift 的官方 GitHub 網址:
https://github.com/realm/realm-swift.git
Xcode 會自動找到這個套件。我保持預設的 Dependency Rule
(Up to Next Major Version),然後點擊 Add Package
。
在下一個視窗中,確認 Realm
和 RealmSwift
這兩個 Package Product
都有被勾選,並加入到我的 App Target 中。
再次點擊 Add Package
。
等待 Xcode 下載完成後,會看到左邊的專案導覽器多了一個「Package Dependencies」的區塊,裡面出現了 Realm。
今天,我們完成了一項至關重要的基礎建設。我們理解了為 App 選擇一個合適儲存倉庫的重要性,並透過 Swift Package Manager,成功地將強大的 RealmSwift
資料庫整合進了我們的專案。