#84 Core Data 的修煉-2:研究 SQLite 資料庫檔案內容

在我們前一篇的筆記中,我們成功建立了一個極簡單的資料表,並將其存儲在 Core Data 使用的 SQLite 資料庫中。在這篇筆記中,我們將深入探索 Core Data 使用的 SQLite 資料庫,了解其內部結構和操作方式。我們將會找到實體 SQLite 檔案,查看並修改其內容,最後觀察修改後在 App 中的顯示異動。

實驗成果

在這次實驗中,我們成功地完成了以下幾個步驟:

  1. 找到實體 SQLite 檔案位置
  2. 查看資料庫內容
  3. 修改資料表內容 & 查看 App 的顯示異動

前一篇 Core Data 實驗

我們建立了一個很簡單的資料表。

1. 找到實體 SQLite 檔案位置

接下來我們來尋找 SQLite 資料庫的存儲位置。我們可以在 Xcode 中進行一些設置,讓其在運行時輸出 SQLite 相關信息。

可以參考這篇文章

Edit Scheme

  1. 點擊專案的 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

--

--