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
相关产品推荐
相关产品推荐

