我已经在Kotlin,Jetpack-compose,MVVM应用程序中设置了一个房间数据库,并一直在使用房间数据库来保存和访问视图模型和仪器测试中的数据。所有这些似乎都工作得非常好。然而,每当我重新运行应用程序时,以前存储在内存中的房间数据库中的数据不会写入磁盘(我相信这一点,因为我使用Android Studio的设备文件资源管理器来监视写入.db文件中的值),因此实际上并没有保存。看起来db-shm文件和db-wal文件的更新频率与应用程序数据库一样频繁。然而,.db文件本身只被创建,然后应用程序再也不会触及它,直到它最终决定创建另一个。
我在网上看了很多关于这个问题的建议,似乎所有地方都应该自动处理,但这并没有发生。我已经注解掉了“fallbackToDestructiveMigration”,验证了我正在查看的文件与应用程序中的文件引用同名,注解掉了“.createFromAsset”,关闭了MainActivity Destroy上的数据库,在应用程序打开时打开了数据库。数据库在应用程序中完全按预期工作,只是在重新启动时没有。注意:我没有使用内存中的数据库。不知道从这里去哪里。
下面是数据库的源代码。
@Database(entities = [BaseUser::class, CommonInfo::class, BaseFriend::class], version = 4, exportSchema = false)
abstract class MyDatabase : RoomDatabase() {
abstract fun commonInfoDao(): CommonInfoDao
abstract fun userDao(): UserDao
abstract fun friendDao(): FriendDao
companion object {
// Singleton prevents multiple
// instances of database opening at the
// same time.
@Volatile
private var INSTANCE: MyDatabase? = null
fun getDatabase(context: Context): MyDatabase {
// if the INSTANCE is not null, then return it,
// if it is, then create the database
return INSTANCE ?: synchronized(this) {
val instance = Room.databaseBuilder(
context.applicationContext,
MyDatabase::class.java,
"my_database.db"
)//.fallbackToDestructiveMigration()
//.createFromAsset("my_database.db")
.build()
INSTANCE = instance
// return instance
instance
}
}
}
}
1条答案
按热度按时间jhdbpxl91#
更新了模块gradle中的所有内容(Kotlin,gradle插件,room等),切换到ksp而不是kapt,并确保关闭数据库,并在主Activity的onDestroy回调中将INSTANCE var设置为null。这已经修复了问题!