iOSやmacOSアプリでCore Dataの問題をデバッグしているとします。UI上でデータがおかしく見え、実際に基盤となるSQLiteファイルに何が保存されているかを確認する必要があります。XcodeのCore Dataモデルエディタはスキーマを表示してくれますが、実際に永続化されたデータを閲覧することはできません。そこで探索が始まります——アプリのコンテナを見つけ、.sqliteファイルの場所を特定し、ターミナルを開いて、ZUSERやZPOSTといった名前のテーブルに対して生のクエリを実行し始めます。すべての列にZという接頭辞が付いており、エンティティ名と直感的に一致するものは何もありません。
Core DataのSQLiteファイルは調べにくい
Core Dataはデフォルトの永続ストアとしてSQLiteを使用しますが、独自の規則を追加します。エンティティ名はテーブル名にZという接頭辞が付きます。属性はZ接頭辞付きの列名になります。リレーションシップは、すぐには認識できないような列に整数の外部キーとして保存されます。Core Dataが内部で管理するZ_METADATAテーブルとZ_PRIMARYKEYテーブルも存在します。
これらは手動での調査を容易にするような形では文書化されていません。結局SELECT * FROM ZUSER;のようなクエリを実行し、Z接頭辞の付いた列を管理オブジェクトモデルに照らし合わせる作業になります。シンタックスハイライトもビジュアルなグリッドもないターミナルでは、これは骨の折れる作業です。
Xcodeもここでは助けになりません。組み込みのSQLiteブラウザは存在しないのです。InstrumentsツールはCore Dataの操作をプロファイリングできますが、実際の行データは表示してくれません。別のツールが必要になります。
TomeでCore DataのSQLiteファイルを閲覧
Tomeは、Core DataのSQLiteファイルを他のデータベースと同じように開きます。アプリのコンテナに移動し、.sqliteファイルを見つけて、Tomeで開きます。Z接頭辞の付いたすべてのテーブルがサイドバーに表示されます。クリックすれば、スクロール可能なグリッドですべての行とその値を確認できます。
実際のデータを確認
アプリが誤った値を表示しているとき、Tomeで.sqliteファイルを開き、実際に保存されているデータを確認しましょう。値そのものがデータベース内で間違っているのか、それとも取得・表示側のバグなのか——生のデータにビジュアルにアクセスできれば、この疑問に数秒で答えが出ます。
リレーションシップとメタデータを確認
Z_PRIMARYKEYテーブルを閲覧すれば、Core Dataがエンティティの種類と主キーをどう追跡しているかが分かります。外部キーの列を確認して、リレーションシップが正しく保存されているか検証しましょう。Z_METADATAを調べれば、モデルバージョンのハッシュも確認できます。
診断クエリを実行
TomeのSQLクエリエディタを使って、Core DataのZ接頭辞付きテーブル間で結合を書いたり、特定のレコードを絞り込んだり、マイグレーションの問題を示唆する孤立した行がないか確認したりできます。シンタックスハイライトとオートコンプリートにより、ターミナルで生のクエリを実行するよりも簡単です。
安全に調査でき、簡単に見つけられる
シミュレータの場合、アプリのSQLiteファイルは~/Library/Developer/CoreSimulator/の奥深くにあります。macOSアプリの場合は、~/Library/Containers/や~/Library/Application Support/を確認してください。ファイルを見つけたら、TomeのDockアイコンにドラッグして閲覧を始めましょう。