6.8 KiB
6.8 KiB
🚨 緊急: 画像パス修復ガイド
発生日: 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: 画像パス診断
操作:
- ソウル画面 → 右上の歯車アイコン
- 「🔬 開発者メニュー」
- 「🔍 画像パス診断」 をタップ
結果の見方:
総アイテム数: 96
問題のあるアイテム: 30 ← この数が重要
欠損ファイル: 45
ステップ2: 画像パス修復
操作:
- 開発者メニュー
- 「🔧 画像パス修復」 をタップ
- 確認ダイアログで「修復する」
処理内容:
1. Hiveの imagePaths を取得
2. 存在しないパスを検出
3. ファイル名で実際のファイルを照合
4. パスを更新
結果の見方:
修復したアイテム: 25
修復したパス: 40
✅ 画像パスを更新しました
ステップ3: 写真の表示確認
操作:
- ホーム画面に戻る
- カード一覧を確認
- 各カードの詳細画面を確認
期待結果:
- 修復されたカードの写真が表示される
- 修復できなかったカードは引き続き表示されない
📋 修復できないケース
ケース1: ファイル自体が存在しない
症状:
修復したアイテム: 0
⚠️ 修復が必要なパスはありませんでした
→ しかし、写真は見れない
原因:
- 画像ファイルが物理的に削除された
- バックアップに画像が含まれていなかった
対応:
- その日本酒を再撮影
- または、削除して再登録
ケース2: ファイル名が一致しない
症状:
⚠️ No match for: OLD_UUID.jpg (日本酒名)
原因:
- バックアップのファイル名と実際のファイル名が異なる
対応:
- 孤立ファイル削除(後述)を実行して確認
- 該当する日本酒を再撮影
🗑️ 孤立ファイル削除
目的
Hiveに参照されていない画像ファイルを削除してストレージを解放
操作
- 開発者メニュー
- 「🗑️ 孤立ファイル削除」 をタップ
- 診断結果を確認
- 確認ダイアログで「削除」
診断結果の見方
孤立ファイル: 15個
サイズ: 145.3MB
⚠️ これらのファイルを削除します
注意事項
⚠️ 削除したファイルは復元できません
📊 ストレージの最終確認
手順
- Androidの設定 → アプリ → ポンシュルーム → ストレージ
- ストレージ使用量を確認
期待値(57枚の場合)
| 項目 | 現在 | 期待値 |
|---|---|---|
| アプリデータ | 409MB | 11-15MB |
| 削減量 | - | 約394MB |
🎯 完全修復の流れ
最適な順序
1. 🔍 画像パス診断
↓
2. 🔧 画像パス修復
↓
3. 📱 写真の表示確認
↓
4. 🗑️ 孤立ファイル削除(オプション)
↓
5. 📊 ストレージ確認
⚠️ よくある質問
Q1: 修復後も写真が見れない
A: 以下を確認してください:
- ファイル自体が存在するか?
- 開発者メニュー → 画像パス診断
- 孤立ファイルがあるか?
- 開発者メニュー → 孤立ファイル削除
- 該当する日本酒を再撮影
Q2: 一括圧縮で20エラー
A: 画像パス修復後に再実行してください:
- 画像パス修復を実行
- 写真の表示確認
- 開発者メニュー → 既存画像を一括圧縮(再実行)
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
次のアクション: 画像パス診断 → 修復 → 確認