一、问题背景项目使用 Room 作为本地 ORM 框架数据库采用自定义外置 SD 存储路径。当前数据库版本为version 5仅编写了3→4、4→5两段迁移脚本。问题来了部分老用户从 V1 / V2 低版本直接覆盖安装新版 App 时由于缺少1→2、2→3的升级 Migration 脚本App 启动时直接抛出异常闪退java.lang.IllegalStateException: A migration from X to Y was required but not found项目现状维度现状数据库版本5已有迁移脚本MIGRATION_3_4、MIGRATION_4_5存储位置外部存储脱离 App 私有目录历史遗留问题早期迭代未留存建表 SQL无法快速补全完整迁移脚本二、两种兜底解决方案对比方案一Application 全局捕获异常 手动删库自愈已废弃实现思路在 Application 全局崩溃捕获器中通过异常关键字匹配「迁移缺失」报错捕获后手动删除.db、.wal、.shm数据库文件然后杀掉进程重启 App 重建数据库。缺点问题说明删库易失效数据库为自定义外置路径极易因路径编码、目录变更导致删库失败用户体验差崩溃后先闪退再重启用户感知明显事后补救属于崩溃后置处理无法在 Room 初始化阶段拦截异常接入官方方案后该部分自定义代码已全部删除。方案二官方 APIfallbackToDestructiveMigration()最终上线方案1. 作用说明当出现以下三种场景时Room 不再抛出崩溃异常而是自动删除旧库并创建全新的空数据库保障 App 正常启动新旧版本数据库不匹配缺失 Migration 迁移脚本数据库文件物理损坏跨大版本升级且无迁移方案⚠️注意此方案的代价是本地缓存数据会被清空但服务端云端数据不受任何影响。2. 接入代码仅需新增一行无需修改 Version 号databaseInstanceRoom.databaseBuilder(context.getApplicationContext(),RoomHelper.class,name).addMigrations(MIGRATION_3_4,MIGRATION_4_5)// 缺少升级脚本 / 库文件损坏时自动重建数据库规避启动闪退.fallbackToDestructiveMigration().allowMainThreadQueries().build();✅重要数据库version保持原有数值不变不需要随意升级版本。三、进阶衍生 API 说明1.fallbackToDestructiveMigrationFrom(int... startVersions)指定低版本号仅当指定版本升级缺失迁移时才自动删库高版本仍正常走 Migration 迁移最大限度保留用户数据。// 只有 1、2 版本升级无迁移时自动删库3 及以上版本正常执行迁移脚本.fallbackToDestructiveMigrationFrom(1,2)2.fallbackToDestructiveMigrationOnDowngrade()仅在版本降级安装时触发删库重建版本升级时优先执行 Migration。适合版本回退场景。3. Migration 与 Destructive 共存逻辑场景行为存在完整 Migration优先执行 SQL 迁移完整保留本地数据无对应 Migration触发自动删库重建逻辑规范建议日常迭代优先新增 MigrationDestructive 只作为异常兜底防线。4. 数据库文件损坏额外防护可选扩展重写onCorruption方法在数据库文件损坏时主动清理损坏文件OverridepublicvoidonCorruption(SupportSQLiteDatabasedb){super.onCorruption(db);db.close();FiledbFilenewFile(DATABASE_PATH,DATABASE_NAME);if(dbFile.exists()){dbFile.delete();newFile(dbFile.getAbsolutePath()-wal).delete();newFile(dbFile.getAbsolutePath()-shm).delete();}databaseInstancenull;}四、上线落地规范✅ 保留现有addMigrations迁移配置高版本有表变更时正常新增 Migration✅ 配置fallbackToDestructiveMigration()作为全场景兜底✅ 删除 Application 中所有自定义异常删库、重启逻辑✅ 版本号跟随表结构变更正常递增不随意改动 Version 用于测试五、总结方案类型推荐做法最优方案补全 Migration完整保留用户数据兜底方案fallbackToDestructiveMigration()保证 App 可用核心要点自定义外置数据库路径的项目尽量避免手写文件删除逻辑路径错误隐患极高生产环境标准配置正常 Migration 迁移 官方 Destructive 兜底兼顾数据安全与 App 可用性