ponshu-room-lite/EMERGENCY_IMAGE_REPAIR.md

310 lines
6.8 KiB
Markdown
Raw Normal View 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
**主要メソッド**:
```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
**次のアクション**: 画像パス診断 → 修復 → 確認