iPod touch Tips/Calendarの解析/テーブル構造
出典: Fukudat
ここにあるのは,FW1.1.xの情報.FW2.x ではデータベースの構造が変更になっている.
データベースファイルが壊れたら,データベースファイルは空の SQLite3 データベースを iPod touch の /private/var/mobile/Library/Calendar/Calendar.sqlitedb において Calendar アプリを起動すると,作り直してくれる.
手元の sqlite3 で初期化するなら,Media:iPod-touch-Calendar-ddl.sql を使おう.
目次 |
Calendarデータ
| カラム名 | データ型 | コメント |
|---|---|---|
| ROWID | INTEGER | 行番号 primary key. 他のテーブルから calendar_id として参照される. |
| title | text | カレンダー名 |
| read_only | INTEGER | 読み取り専用なら non zero (?) |
複数のカレンダーを管理することが想定されているものと考えられるが, iPod touchのカレンダーアプリケーションでは新しいカレンダーを作成することはできない. デフォルトのカレンダーは ROWID = 1, title = default, read_only = 0 となっている.
Eventデータ
| カラム名 | データ型 | コメント |
|---|---|---|
| ROWID | INTEGER | 行番号 primary key |
| summary | TEXT | 要約 |
| location | TEXT | 場所 |
| description | TEXT | 説明 |
| start_date | INTEGER | 開始時刻 |
| start_tz | TEXT | 開始時刻のタイムゾーン |
| end_date | INTEGER | 終了時刻 |
| all_day | INTEGER | 終日イベント |
| calendar_id | INTEGER | カレンダー番号.Calendar.ROWID を参照する foreign key |
| orig_event_id | INTEGER | 元となったイベントの ROWID.そうでないときは 0 |
| orig_start_date | INTEGER | 元となったイベントの開始時刻. |
この予定一つがこのテーブルの1行になると考えられる.
時刻は 2001年1月1日0:00GMT からの経過秒数で表現されている(iPod時間と呼ぶことにしよう). したがって,UNIX時間(1970年1月1日からの経過秒数)からiPod時間への変換には 978307200 を引けばよい.
| カラム名 | データ型 | コメント |
|---|---|---|
| record | INTEGER | Event.ROWID (forign key) |
| type | INTEGER | 変更種類 (0 = 新規, 1 = 変更, 2 = 削除) |
| カラム名 | データ型 | コメント |
|---|---|---|
| event_id | INTEGER | |
| date | INTEGER |
Alarmデータ
| カラム名 | データ型 | コメント |
|---|---|---|
| ROWID | INTEGER | 行番号 primary key |
| trigger_date | INTEGER | 0x80000000 が入っている(意味は不明) |
| trigger_interval | INTEGER | アラームを鳴らすイベントの開始時刻からの秒数.例えば5分前なら -300 |
| type | INTEGER | 0 (意味は不明) |
| entity_id | INTEGER | Event.ROWID (foreign key) |
| entity_type | INTEGER | 2 (意味は不明) |
trigger_date には32bit整数の最小値,typeには0, entity_typeも2が常に入っており,それ以外の値を見たことがない.
| カラム名 | データ型 | コメント |
|---|---|---|
| record | INTEGER | Event.ROWID (forign key) |
| type | INTEGER | 変更種類 (0 = 新規, 1 = 変更, 2 = 削除) |
Recurrenceデータ
| カラム名 | データ型 | コメント |
|---|---|---|
| ROWID | INTEGER | 行番号 (primary key) |
| frequency | INTEGER | 繰り返し間隔の単位.日=1, 週=2, 月=3, 年=4 |
| interval | INTEGER | frequency * interval が繰り返し間隔となる.frequency = 2, interval = 2 で2週間に1回. |
| week_start | INTEGER | |
| count | INTEGER | |
| cache_end_date | INTEGER | |
| cache_end_date_tz | TEXT | |
| end_date | INTEGER | |
| specifier | TEXT | |
| by_month_months | INTEGER | |
| event_id | INTEGER | Event.ROWID (foreign key) |
繰り返しのあるイベントは,その繰り返し情報がこのテーブルに格納される.
Occurrenceテーブル
| カラム名 | データ型 | コメント |
|---|---|---|
| day | INTEGER | |
| event_id | INTEGER | |
| occurrence_date | INTEGER | |
| occurrence_start_date | INTEGER |
どうやら,リストビューで表示するためにイベントはこのテーブルに "cache" されるようだ.おそらく繰り返しのあるエントリを処理するためだろうと思うが,1回きりのイベントもこのテーブルに入っていないと,リストビューでは表示されない.
| カラム名 | データ型 | コメント |
|---|---|---|
| day | INTEGER | primary key |
| count | INTEGER |
