iPod touch Tips/Calendarの解析

出典: Fukudat

iPod touchをPDAとしても使いたい.

会社のグループウェア(Lotus Notes)のカレンダーと同期をとることを目指して,iPod touch のカレンダーアプリの解析を行う.

この解析結果に基づいてLotus Notesのカレンダーと同期する方法を作った.まだ不完全だが,とりあえず私としては満足.

データの所在

予定などを記録しているデータの所在を探す.

$ ssh -l root ipod find / -name "*Calendar*"
/Applications/DemoApp.app/Calendar.framework
...<snip>...
/private/var/mobile/Library/Calendar/Calendar.sqlitedb

sqlitedb に入っていることを確認.

Calendarアプリからいくつか確認用の予定データを入力してから,下のコマンドでファイルをゲット.file コマンドで SQLite 3.x database であることを確認.

$ scp root@ipod:/private/var/mobile/Library/Calendar/Calendar.sqlitedb .
$ file Calendar.sqlitedb
Calendar.sqlitedb: SQLite 3.x database

テーブル構造

sqlite3 でテーブルの構造を確認.

$ sqlite3 Calendar.sqlitedb
SQLite version 3.5.5
Enter ".help" for instructions
sqlite> .tables
Alarm                      OccurrenceCache
AlarmChanges               OccurrenceCacheDays
Calendar                   Recurrence
CalendarChanges            RecurrenceChanges
Event                      Task
EventChanges               TaskChanges
EventExceptionDate         _SqliteDatabaseProperties
sqlite> .schema Alarm
...<snip>...

解析結果をテーブル構造に示す.

要約すると

  • Event テーブルにイベントとして予定を格納
  • OccurrenceCache テーブルにイベントを発生日にグルーピングしてキャッシュ
  • OccurrenceCacheDays に1日ごとのイベントの数を数えておく
  • Alarm にアラームを鳴らす時間を設定

している.

データベースの初期化

カレンダーデータベースを初期化するには,Media:iPod-touch-Calendar-ddl.sql を ddl.sql としてダウンロードして,以下を実行.

$ rm -f Calendar.sqlitedb          # データベースファイルを消去
$ sqlite3 dbfile < ddl.sql         # データベースを作りなおし

ddl.sql では,テーブルを定義し,_SqliteDatabaseProperties に必要な行を挿入している. この _SqliteDatabaseProperties には _UniqueIdentifier というキーがあるので,その値は個々の iPod で違うのかもしれない(1台しか持っていないので確かめようがない).その場合は,ddl.sql の中身を書き換える必要がある.