# 🚨 緊急: 画像パス修復ガイド **発生日**: 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 **主要メソッド**: ```dart // 診断 Future<(int, int, int)> diagnose() // → (総アイテム, 問題あり, 欠損ファイル) // 修復 Future<(int, int)> repair() // → (修復アイテム, 修復パス) // 孤立ファイル検出 Future<(int, int)> findOrphanedFiles() // → (孤立ファイル数, サイズ) // 孤立ファイル削除 Future<(int, int)> cleanOrphanedFiles() // → (削除数, サイズ) ``` ### 修復ロジック ```dart 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 **次のアクション**: 画像パス診断 → 修復 → 確認