You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Room开发:为何多次构建后数据库数据会丢失?

Room数据库重新构建运行后数据偶尔丢失的原因分析

背景与问题

正在学习Android官方Room开发课程,定义的数据库类单例实现如下:

@Database(entities = [Item::class], version = 1, exportSchema = false)
abstract class InventoryDatabase : RoomDatabase() {
    abstract fun itemDao(): ItemDao

    companion object {
        @Volatile
        private var Instance: InventoryDatabase? = null

        fun getDatabase(context: Context): InventoryDatabase {
            return Instance ?: synchronized(this) {
                Room.databaseBuilder(context, InventoryDatabase::class.java, "item_database")
                    .fallbackToDestructiveMigration()
                    .build()
                    .also { Instance = it }
            }
        }
    }
}

数据库版本未修改,DB、DAO及Entity类也未变更(不会导致Schema变化),按预期数据应持久化,但重新构建运行应用后数据有时会丢失,请问原因是什么?是否会在文件系统中产生多个数据库实例?

问题解答

是否会产生多个数据库实例?

你的单例实现逻辑是正确的:@Volatile保证了Instance变量的跨线程可见性,synchronized代码块确保了线程安全的实例创建逻辑,每次调用getDatabase()都会返回同一个数据库实例,文件系统中不会生成多个item_database相关的数据库文件。

数据偶尔丢失的可能原因

  • Android Studio运行配置的清除数据行为:如果在Run配置的「Launch Options」中勾选了「Clear app data」,每次运行应用都会清除所有应用数据(包括数据库)。可以检查Run配置,确认该选项未被勾选。
  • fallbackToDestructiveMigration()的隐性触发:即使你认为Schema未变化,Room在校验时若发现预期Schema与实际数据库的Schema不匹配(比如Kotlin编译优化导致Entity字节码变化、旧测试版本残留不同Schema),会触发破坏性迁移——直接删除旧数据库并重建,导致数据丢失。建议开启exportSchema = true,生成Schema文件来对比一致性。
  • 应用被意外卸载/重装:如果运行前应用被手动卸载,或者Studio的Run配置包含卸载旧应用的逻辑,会直接清除所有数据。
  • 数据库文件被误删:比如通过Device File Explorer手动删除了/data/data/[你的包名]/databases/下的数据库文件,或者应用内的调试、测试代码误执行了删除逻辑。

内容的提问来源于stack exchange,提问作者BobDoolittle

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 21:53:09