Thursday, August 16, 2012

iPhone/iPad のカレンダーで「その他」の「誕生日」が重複していくつも表示される問題 - 解決編 [memo]

iPhone/iPad の「誕生日カレンダー」が増殖する問題,前エントリーの問題特定編 に続いて解決編です.

最初に断っておくと,増殖した誕生日カレンダーを1つに戻すことには (痛みを伴いつつも) 成功しましたが,「そもそもなぜ増殖したか」の根本原因は分かっていません.なのでこの症状が再現する可能性は残っています.またこの方法を試される場合は,自己責任でお願いします.


【ローカルのゾンビを殺せばいい】

ここまでで,「なにかの拍子に,誕生日カレンダーのゾンビが,iCloud ではなくローカルに作られた」ということが分かったので,要はこのゾンビを殺したいわけです.

もし iPhone/iPad を jailbreak (脱獄) しているなら話は簡単で, /var/mobile/Library/Calendar を覗いて calendar.sqlitedb を消してしまえば OK だと思います (試してないので分かりませんが…).

しかし私は iPhone/iPad を jailbreak していないし,この為に jailbreak する気にもなれない.ちなみに jailbreak していない環境では, /var/mobile/Media/ 以下のディレクトリしか見ることができません.


【ではどうしたか】

脱獄なしに,iPhone/iPad の /var/mobile/Library/Calendar/calendar.sqlitedb を直接触ることはできませんが,バックアップしたデータの当該ファイルを消すことはできるわけです.

まず,普段は iCloud 上にバックアップを取っていても,一度ローカルにバックアップを作成します.

aaa

次に iExplore  (無料版のデモバージョンで OK) でバックアップされたデータを覗き,calendar.sqlitedb ファイルを特定し,これを削除します.

bbb

これで iPhone/iPad のデータはそのまま,但しカレンダーだけ無い状態,というバックアップが出来あがります.

iPhone/iPad を初期化し,このバックアップで復元してやれば,今まで使っていた iPhone/iPad と同等でカレンダーだけ初期化された状態.カレンダーのデータは iCloud 上にあるので,iCloud と同期すれば元通りになる.

…という挙動を期待していたのですが,calendar.sqlitedb を削除したバックアップデータは不完全と見なされ,復元の途中で「このデータは壊れている」という旨のエラーメッセージが出ました.

ccc

それでも復元はほぼ終了しており,ほとんど元の iPhone/iPad と同じ状態になりますが,「設定」の内容や一部のアプリのデータは復元されず,初期状態になっていました.


というわけで,
・根本的な問題の発生原因は分かっていない
・完全な状態で復元できなかったので,設定を一通り見直すことになる
という,なんとも片手落ちな状態かつ,決してオススメできる方法でもありませんが,誰かの参考にでもなればと思い,記録しておきました.


あと,calendar.sqlitedb は SQLite 3 なので,SQLite が分かる人は,このファイルを削除するのではなく編集する方が良いかも.…と書いて何を言っているのか分かる人には説明は不要だと思いますが,

% sqlite3 ~/Library/Application\ Support/MobileSync/Backup/XXX/YYY

sqlite> .table

sqlite> .header ON

sqlite> select * from Calendar;

sqlite> delete from Calendar where rowid between XXX and YYY;


みたいな感じで.


0 comments: