Appleヘルスケア取り込み設計
一言でいうと
Appleヘルスケアzipは「全部を食事ログに足す」じゃなくて、「元データを保管する」「HealthKitの数値として正規化する」「あすけんPFCは別レイヤーで見る」の3段に分けるのが安全。手入力したごはんと、あすけん由来の日次PFCを混ぜると普通に二重計上するから、ここは私がちゃんと止める。
健人くんのzipは、いまMac上では「ファイル名とサイズだけ見えて、中身がまだローカルに落ちてない」状態。だから先に受け皿を作って、読めるようになった瞬間にドライランで中身を見てから入れる形にした。
どんなデータが入りそう?
Appleヘルスケアの標準エクスポートは export.zip の中に apple_health_export/export.xml があり、主にこの形で入る。
- Record: 歩数、体重、体脂肪率、摂取カロリー、PFC、睡眠、心拍などの時系列データ
- Workout: Apple Watchなどの運動ログ。種目、時間、距離、消費カロリーを持つ
- ActivitySummary: ムーブ/エクササイズ/スタンド系のサマリが入ることがある
- export_cda.xml や clinical-records: 医療機関連携系。今回はまず読まない
- workout route系ファイル: 位置情報を含み得るので、初回は保存対象から外す
参照した形式情報では、Record は type, unit, value, sourceName, sourceVersion, device, creationDate, startDate, endDate を持つ。Workout も同じく source と開始終了日時を持つ。
あすけんの扱い
あすけんはApp Store説明で、Appleヘルスケアへ15種類の栄養素を書き込むと明記している。対象は、摂取エネルギー、たんぱく質、総脂肪、炭水化物、カルシウム、チアミン、ナトリウム、ビタミンA、ビタミンB2、ビタミンC、ビタミンE、食物繊維、糖分、鉄分、飽和脂肪酸。
なので importer ではこのHealthKit typeを「nutrition」として拾う。
- HKQuantityTypeIdentifierDietaryEnergyConsumed → energy_kcal
- HKQuantityTypeIdentifierDietaryProtein → protein_g
- HKQuantityTypeIdentifierDietaryFatTotal → fat_g
- HKQuantityTypeIdentifierDietaryCarbohydrates → carbs_g
- そのほかミネラル/ビタミン/糖質/食物繊維系も保存
ただし、あすけんが渡すのはたぶん「食事の明細」ではなく「栄養素の日次または食事単位の数値」。商品名やメニュー名まで取れる期待は薄い。ここ勘違いすると事故るやつ!
格納の分け方
まず projects/health-data/data/health.sqlite に入れる。
import_runs
いつ、どのzipから、何件読んだか
health_records
Apple Health の Record をほぼそのまま正規化
type / unit / value / source_name / start_date / end_date / metadata
workouts
Workout を正規化
activity_type / duration / distance / energy / source / start_date / end_date
食事ログ projects/meal-tracker/data/meal_log.sqlite へはいきなり混ぜない。理由は、Telegramで手入力したファミマチキンや牛丼と、あすけん由来の日次PFCが同じ日に重なると、カロリーが二重計上されるから。
私の推奨はこれ。
- Apple Health / あすけん由来は health.sqlite に全部保存
- Viewでは「手入力PFC」と「あすけんPFC」を別レイヤーで表示
- 食事ログへ反映するのは、日付単位で「手入力がない日だけ」または明示フラグ付きにする
作ったもの
- projects/health-data/scripts/import_apple_health.py
- projects/health-data/data/health.sqlite のスキーマ
- projects/health-data/README.md
- scripts/test_import_apple_health.py
importerは --dry-run でDBへ書かずに中身の種類、sourceName、栄養素の直近日次集計を見る。実取り込みは --copy-raw 付きで元zipも raw/ に保存する。
追記: iCloud実体化後にzip自体は読めたが、export.xml の末尾が閉じていない状態だった。zipのCRCテストはOKなので圧縮ファイルとしては壊れていないが、Apple Health側のXML生成が途中で切れている。これに対応するため、importerに --allow-partial を追加した。壊れる前の完全なRecord/Workoutだけを保存し、import_runs.partial と parse_error に「部分取り込み」の証拠を残す。
実取り込み結果
Finder/Peekaboo相当の操作より先に brctl download でiCloudファイルを実体化できた。PeekabooはScreen Recording権限がなく画面認識は不可、Accessibilityはあり。
取り込みは --allow-partial --copy-raw で実行した。
- 元zip保管: projects/health-data/raw/apple-health-export-20260523-200500.zip
- export date: 2026-05-23 19:18:34 +0900
- health_records: 853,773件
- workouts: 0件
- partial: 1
- parse_error: unclosed token: line 2291969, column 1
多いsource:
- 相原健人のApple Watch: 790,309件
- iPandora XR: 54,558件
- HUAWEIヘルスケア: 6,304件
- eufy Life: 2,069件
- InBody: 380件
- あすけん: 83件
- WaterMinder: 64件
多いtype:
- HeartRate: 718,447件
- StepCount: 133,011件
- BodyMass: 518件
- BodyFatPercentage: 446件
- Height: 432件
- BodyMassIndex: 427件
- LeanBodyMass: 427件
- DietaryWater: 64件
あすけん由来で入っていたのは、今回読めた範囲では体重64件と体脂肪率19件だけ。PFC/kcalは見つからなかった。HealthKit連携設定の栄養素書き込みがオフだったか、export.xmlの壊れている後半側にあるか、そもそもあすけん側から食事栄養素をヘルスケアに書いていなかった可能性が高い。
いまのブロッカー
対象zip:
/Users/aiharataketo/Library/Mobile Documents/com~apple~CloudDocs/Downloads/書き出したデータ.zip
見えている状態:
- 表示サイズ: 約28.9MB
- 実ブロック: 0
- 読み込み: Resource deadlock avoided
つまりiCloud上にはあるけど、このMacのローカルファイルとしてまだ読めない。Finderで雲アイコンが消えるまでダウンロードするか、いったん通常の ~/Downloads や Desktop にコピーして、実体がある状態にしてから取り込む。
ソース
- Apple Health exportのXML構造例: https://www.tdda.info/in-defence-of-xml-exporting-and-analysing-apple-health-data
- Apple Health exportの解析例: https://www.markwk.com/data-analysis-for-apple-health.html
- あすけん App Store説明: https://apps.apple.com/jp/app/%E3%81%82%E3%81%99%E3%81%91%E3%82%93-%E3%83%80%E3%82%A4%E3%82%A8%E3%83%83%E3%83%88-%E3%83%98%E3%83%AB%E3%82%B9%E3%82%B1%E3%82%A2%E3%81%AE%E3%82%AB%E3%83%AD%E3%83%AA%E3%83%BC%E8%A8%88%E7%AE%97%E3%82%84%E4%BD%93%E9%87%8D%E7%AE%A1%E7%90%86%E3%81%AB/id687287242
確認したこと
- importerの構文チェックOK
- サンプルzipでdry-runと実取り込みのテストOK
- View URL確認: http://127.0.0.1:8765/20260523-apple-health-import-design.html が 200 OK