#84 Core Data 的修煉-2:研究 SQLite 資料庫檔案內容
在我們前一篇的筆記中,我們成功建立了一個極簡單的資料表,並將其存儲在 Core Data 使用的 SQLite 資料庫中。在這篇筆記中,我們將深入探索 Core Data 使用的 SQLite 資料庫,了解其內部結構和操作方式。我們將會找到實體 SQLite 檔案,查看並修改其內容,最後觀察修改後在 App 中的顯示異動。
實驗成果
在這次實驗中,我們成功地完成了以下幾個步驟:
- 找到實體 SQLite 檔案位置
- 查看資料庫內容
- 修改資料表內容 & 查看 App 的顯示異動
前一篇 Core Data 實驗
我們建立了一個很簡單的資料表。
1. 找到實體 SQLite 檔案位置
接下來我們來尋找 SQLite 資料庫的存儲位置。我們可以在 Xcode 中進行一些設置,讓其在運行時輸出 SQLite 相關信息。
可以參考這篇文章
Edit Scheme
- 點擊專案的 Scheme(位於左上角)並選擇 “Edit Scheme…”。
2. 在彈出的視窗中,選擇 “Run”,然後點擊 “Arguments” 選項。
在 “Arguments Passed On Launch” 部分添加以下兩個選項:
-com.apple.CoreData.SQLDebug 1
-com.apple.CoreData.Logging.stderr 1
這樣我們就可以輕鬆地找到 Core Data 的 SQLite 資料庫文件位置,並監控 Core Data 執行的 SQL 語句和相關操作的執行時間。
探索 SQLite 資料庫
現在,當我們執行專案時,可以在控制台中看到 SQLite 資料庫的路徑信息。
執行時果然順利找到了 sqlite 的位置
CoreData: annotation: Connecting to sqlite database file at "/Users/jasonhung/Library/Developer/CoreSimulator/Devices/AC912C82-2AB0-4A0F-8E87-F6AB49BC539D/data/Containers/Data/Application/0D53D9E1-650B-48CA-898E-ADE6975C2DC2/Library/Application Support/phw23_2_coredata.sqlite"
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: pragma recursive_triggers=1
CoreData: sql: pragma journal_mode=wal
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZSIMPLE_VALUE FROM ZSIMPLEENTITY t0
CoreData: annotation: sql connection fetch time: 0.0000s
CoreData: annotation: total fetch execution time: 0.0001s for 11 rows.
在 Finder 中打開該路徑,可以看到 SQLite 資料庫文件以及兩個附屬文件(.sqlite-shm
和 .sqlite-wal
)。
2. 查看 SQLite 資料庫內容
使用 SQLite 資料庫管理工具
我們可以使用各種 SQLite 資料庫管理工具來打開和探索這個 SQLite 資料庫,例如 SQLiteBrowser、DB Browser for SQLite 等。使用這些工具,可以輕鬆地查看資料表結構、瀏覽數據和執行 SQL 查詢。
首先看到有4個資料表,都點進去看看有什麼資料
ZSIMPLEENTITY
這個看起來就是我們儲存資料的地方,對照一下我們在 Xcode 的設定
ZSIMPLEENTITY 就是我們的 Entity
ZSIMPLE_VALUE 就是我們的欄位,可以看到內容就是我們之前 APP 寫入的資料。
Z_METADATA、Z_MODELCACHE
Z_PRIMARYKEY
看起來是記錄各資料表的目前流水號的值。
3. 修改資料表內容&查看 App 的顯示異動
在 SQLite 資料庫管理工具中,我們可以直接修改資料表內容。再次執行 App ,果然可以看到剛剛被我們修改的字串。
結語:
透過這篇文章,我們深入研究了 Core Data 使用的 SQLite 資料庫,探索了其內部結構和操作方式。通過了解 SQLite 資料庫的存儲位置,我們可以輕鬆地查看和管理其中的數據。使用 SQLite 資料庫管理工具,也讓我們能夠更方便的進行資料的查詢、修改和測試。
希望本篇文章能夠幫助你更深入地了解 Core Data 與 SQLite 資料庫之間的關係,並在你的開發過程中發揮更大的作用。
附錄:
研究輸出訊息
資料庫連接訊息:
CoreData: annotation: Connecting to sqlite database file at "/Users/jasonhung/Library/Developer/CoreSimulator/Devices/AC912C82-2AB0-4A0F-8E87-F6AB49BC539D/data/Containers/Data/Application/0D53D9E1-650B-48CA-898E-ADE6975C2DC2/Library/Application Support/phw23_2_coredata.sqlite"
這條訊息表示 Core Data 正在連接到指定位置的 SQLite 資料庫文件。路徑中包含模擬器設備和應用程序容器的相關資料。這可以幫助我們找到實際存儲資料的 SQLite 文件。
把路徑複製起來,到 Finder > Go > Go to Folder
把路徑貼上去就OK了
可以看到有 3 個檔案
- phw23_2_coredata.sqlite
- phw23_2_coredata.sqlite-shm
- phw23_2_coredata.sqlite-wal
查詢資料表名稱:
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
這條 SQL 語句查詢了 SQLite 資料庫的 SQLITE_MASTER
表,以檢查 Z_METADATA
表是否存在。SQLITE_MASTER
是 SQLite 的系統表,存儲了資料庫中的所有表格資訊。
啟用遞歸觸發器:
CoreData: sql: pragma recursive_triggers=1
這條語句啟用了遞歸觸發器。這對於使用 SQLite 的資料庫操作觸發器時可能是必要的設置。
設定日誌模式為 WAL:
CoreData: sql: pragma journal_mode=wal
這條語句將資料庫的日誌模式設置為 WAL(Write-Ahead Logging)。WAL 模式通常提供更好的寫入性能和多線程並發支持。
查詢元數據表:
CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA
這條語句從 Z_METADATA
表中檢索版本號、UUID 和 plist 資訊。Z_METADATA
表存儲了有關資料庫模型和版本的元數據。
重複查詢元數據表:
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA'
再次檢查 Z_METADATA
表是否存在。這可能是確保表存在的額外檢查。
查詢模型緩存表:
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_MODELCACHE'
這條語句檢查 Z_MODELCACHE
表是否存在。Z_MODELCACHE
表存儲了模型緩存資訊。
查詢更改記錄表:
CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'ACHANGE'
查詢 ZSIMPLEENTITY
表:
CoreData: sql: SELECT 0, t0.Z_PK, t0.Z_OPT, t0.ZSIMPLE_VALUE FROM ZSIMPLEENTITY t0
這條語句從 ZSIMPLEENTITY
表中選取數據。Z_PK
是主鍵,Z_OPT
是優化版本號,ZSIMPLE_VALUE
是儲存的數據欄位。t0
是表的別名。
這些訊息詳細展示了 Core Data 如何與 SQLite 資料庫交互,包括建立連接、設置資料庫屬性、查詢和操作數據表等。理解這些訊息有助於進一步了解 Core Data 的內部工作原理,並且在需要進行性能調優或排除故障時特別有用。設置這些運行時參數是調試 Core Data 應用程序的一個有力工具。
參考:
-com.apple.CoreData.SQLDebug 1
//CoreData: sql: pragma journal_mode=wal
-com.apple.CoreData.SQLDebug 1
-com.apple.CoreData.Logging.stderr 1
-com.apple.CoreData.SQLDebug 1
-com.apple.CoreData.ConcurrencyDebug 1
-com.apple.CoreData.MigrationDebug 1