keynote書類の内部構造を見る

Documents in the Cloudが扱う文書には、「Document Storage」と「Key-Value Storage」(KVS)という2種類の型があることは前述したとおりだが、ローカルにキャッシュされているとなると、KVSがどのような形で存在するかを目視できるということになる。ここでは、プレゼンテーションソフト「Keynote」を例に、その構造を見てみたい。

まず、Finderでローカルのキャッシュ領域(~/Library/Mobile Documents/com~apple~Keynote/Documents)を見ると、一見では通常どおりのKeynote書類が一覧される。しかし、Finderの情報ウインドウで確認すると、独立したファイルとして書き出したKeynote書類(*.key)とはファイルサイズが異なることがわかる。

これは、キャッシュ領域上に表示されたiOSで作成したKeynote書類をよく見るとわかる。通常のファイルではなく、拡張子「.key-tef」のバンドル構造を持つ特殊な書類で、内部にはプレビュー画像のほかに「index.db」というファイルを確認できる。これは、軽量・高速で知られるSQLite 3のデータベースフォーマットだ。sqlite3コマンドでindex.dbの内容を見ると、「cullingState」や「dataStates」といったテーブルを確認できることからしても、このデータベースにKeynote書類の実体(KVSの集合)が格納されていることがわかる。

キャッシュ領域のKeynote用フォルダをTerminalで表示したところ。iOS版Keynoteで作成した文書は、バンドルの形で同期されている

Keynoteのキャッシュ領域をTerminalで表示したところ。このようにバンドル内部にデータベースファイルがあり、KVS型データが格納されている

バンドル内部の「index.db」をsqlite3コマンドで確認したところ。テーブル構造があることがわかる

なお、OS X版Keynoteでこの書類に対し上書き保存を行うと、バンドル内部はXMLを用いる従来のフォーマットに変換されてしまう。これは、OS X版Keynoteのエンジン部分が完全なKVS対応ではなく、インポート機能が追加されただけ(iCloudへは従来型書類をアップロードしiOS版Keynoteではそれをコンバート)と推測できる。そうであれば、OS X版Keynoteで作成した書類をiOS版Keynoteで開くとき、多少の時間がかかることも理解できる。

Keynote書類のしくみはあくまで一例だが、PagesとNumbersの文書も同様の構造を持つことから、今後Documents in the Cloudに対応するアプリケーションの文書にも類推適用できると考えられる。そうなると、見た目は(単一構造の)ファイルだが実体はフォルダ(バンドル)、という書類は今後増加していくのだろう。