ponshu-room-lite/docs/archive/EMERGENCY_IMAGE_REPAIR.md

6.8 KiB
Raw Permalink Blame History

🚨 緊急: 画像パス修復ガイド

発生日: 2026-01-22
影響: バックアップ復元後に写真が見れなくなる
ステータス: 修復ツール作成完了


📊 現状

一括圧縮の結果

圧縮: 59枚
スキップ: 17枚
エラー: 20枚 ← 🚨 これが問題
削減: 35.2MB

バックアップ復元の結果

復元前: 一部の写真が見れない
復元後: 見えない写真がさらに増えた ← 🚨 悪化

🔍 問題の原因

1. 画像パスの不整合

バックアップの仕組み:

1. バックアップ作成時:
   imagePaths: ["/data/user/0/.../app_flutter/UUID_A.jpg"]
   
2. バックアップ復元時:
   - 画像ファイル: UUID_B.jpg でコピー新しいUUID
   - Hive: 古いパス("/data/user/0/.../UUID_A.jpg")のまま復元
   
3. 結果:
   - Hive: UUID_A.jpg を参照
   - 実際のファイル: UUID_B.jpg が存在
   - 画像が見れない ❌

2. 一括圧縮の20エラー

考えられる原因:

  • ファイルが既に存在しない(パス不整合)
  • ファイルが破損している
  • 権限エラー

修復手順(必須)

ステップ1: 画像パス診断

操作:

  1. ソウル画面 → 右上の歯車アイコン
  2. 🔬 開発者メニュー」
  3. 🔍 画像パス診断」 をタップ

結果の見方:

総アイテム数: 96
問題のあるアイテム: 30 ← この数が重要
欠損ファイル: 45

ステップ2: 画像パス修復

操作:

  1. 開発者メニュー
  2. 🔧 画像パス修復」 をタップ
  3. 確認ダイアログで「修復する」

処理内容:

1. Hiveの imagePaths を取得
2. 存在しないパスを検出
3. ファイル名で実際のファイルを照合
4. パスを更新

結果の見方:

修復したアイテム: 25
修復したパス: 40

✅ 画像パスを更新しました

ステップ3: 写真の表示確認

操作:

  1. ホーム画面に戻る
  2. カード一覧を確認
  3. 各カードの詳細画面を確認

期待結果:

  • 修復されたカードの写真が表示される
  • 修復できなかったカードは引き続き表示されない

📋 修復できないケース

ケース1: ファイル自体が存在しない

症状:

修復したアイテム: 0
⚠️ 修復が必要なパスはありませんでした

→ しかし、写真は見れない

原因:

  • 画像ファイルが物理的に削除された
  • バックアップに画像が含まれていなかった

対応:

  • その日本酒を再撮影
  • または、削除して再登録

ケース2: ファイル名が一致しない

症状:

⚠️ No match for: OLD_UUID.jpg (日本酒名)

原因:

  • バックアップのファイル名と実際のファイル名が異なる

対応:

  • 孤立ファイル削除(後述)を実行して確認
  • 該当する日本酒を再撮影

🗑️ 孤立ファイル削除

目的

Hiveに参照されていない画像ファイルを削除してストレージを解放

操作

  1. 開発者メニュー
  2. 🗑️ 孤立ファイル削除」 をタップ
  3. 診断結果を確認
  4. 確認ダイアログで「削除」

診断結果の見方

孤立ファイル: 15個
サイズ: 145.3MB

⚠️ これらのファイルを削除します

注意事項

⚠️ 削除したファイルは復元できません


📊 ストレージの最終確認

手順

  1. Androidの設定 → アプリ → ポンシュルーム → ストレージ
  2. ストレージ使用量を確認

期待値57枚の場合

項目 現在 期待値
アプリデータ 409MB 11-15MB
削減量 - 約394MB

🎯 完全修復の流れ

最適な順序

1. 🔍 画像パス診断
   ↓
2. 🔧 画像パス修復
   ↓
3. 📱 写真の表示確認
   ↓
4. 🗑️ 孤立ファイル削除(オプション)
   ↓
5. 📊 ストレージ確認

⚠️ よくある質問

Q1: 修復後も写真が見れない

A: 以下を確認してください:

  1. ファイル自体が存在するか?
    • 開発者メニュー → 画像パス診断
  2. 孤立ファイルがあるか?
    • 開発者メニュー → 孤立ファイル削除
  3. 該当する日本酒を再撮影

Q2: 一括圧縮で20エラー

A: 画像パス修復後に再実行してください:

  1. 画像パス修復を実行
  2. 写真の表示確認
  3. 開発者メニュー → 既存画像を一括圧縮(再実行)

Q3: バックアップ復元で悪化した

A: 今回の修復ツールで対応可能です:

  • バックアップ復元 → 画像パス不整合
  • 画像パス修復 → パスを正しく更新

Q4: どの写真が見れないかわからない

A: カード一覧画面で確認:

  • 写真が表示されていないカード = 問題あり
  • グレーの背景 or エラーアイコン = ファイル不在

🔧 技術的な詳細

修復ツールの実装

ファイル:

  • lib/services/image_path_repair_service.dart - 修復ロジック
  • lib/screens/dev_menu_screen.dart - UI

主要メソッド:

// 診断
Future<(int, int, int)> diagnose()
// → (総アイテム, 問題あり, 欠損ファイル)

// 修復
Future<(int, int)> repair()
// → (修復アイテム, 修復パス)

// 孤立ファイル検出
Future<(int, int)> findOrphanedFiles()
// → (孤立ファイル数, サイズ)

// 孤立ファイル削除
Future<(int, int)> cleanOrphanedFiles()
// → (削除数, サイズ)

修復ロジック

1. Hiveの全SakeItemを取得
2. 各アイテムの imagePaths をチェック
3. 存在しないパスを検出
4. ファイル名で照合:
   - バックアップ: /old/path/UUID_A.jpg
   - 実際: /new/path/UUID_A.jpg
   - マッチング: ファイル名(UUID_A.jpg)で照合
5. パスを更新してHiveに保存

📝 今後の対策

1. バックアップ復元の改善(将来対応)

現在の問題:

  • 画像パスが絶対パスで保存される
  • 復元時にパスが不整合

改善案:

  • 相対パスで保存
  • 復元時にパスを自動更新

2. 一括圧縮の改善

現在の問題:

  • 20エラーが発生

改善案:

  • エラー時の詳細ログ
  • リトライ機能
  • エラーファイルのリスト出力

3. 画像ファイル管理の改善

現在の問題:

  • 孤立ファイルが発生しやすい

改善案:

  • 削除時に自動クリーンアップ
  • 定期的な整合性チェック

作成日: 2026-01-22
作成者: Cursor AI
優先度: 🔴 Critical
次のアクション: 画像パス診断 → 修復 → 確認