在 Kotlin Jetpack Compose 项目中的运行之间,房间插入不持久
Room Insert Not Persisting between Runs in Kotlin Jetpack Compose Project
我正在开发一个 Android Jetpack Compose 项目,其中包含预填充的 Room 数据库。
读取数据库效果很好,但是...
当我插入一条新记录时,它不会持续到下一次我 运行 应用程序。 我没有使用 inMemoryDatabaseBuilder()。
我知道当应用程序在内存中时它可以工作,因为我可以在屏幕上看到结果,但是,一旦我停止应用程序,我的插入就会消失。我还检查了底层数据库文件,我的插入从未提交到数据库,无论是在 运行ning 还是在我关闭它之后。
我做错了什么?
感谢您的帮助!
这是我的用户界面中的语句,它向我的数据库添加了一个新人:
viewModel.insertMyInfo(newMyInfo)
它在内存中有效,但是我一退出应用程序,新添加的记录就消失了。
App Inspector LiveData 显示我添加的内容。
viewModel插入函数
fun insertMyInfo(myInfo: MyInfo) {
myInfoRepository.insertMyInfo(myInfo)
}
似乎只提交到内存,而不是磁盘。
DAO @Insert
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertMyInfo(vararg myInfo: MyInfo)
我用 suspend
试过了,没区别
存储库功能
fun insertMyInfo(newMyInfo: MyInfo) {
coroutineScope.launch(Dispatchers.IO) {
myInfoDAO.insertMyInfo(newMyInfo)
}
}
数据库
@Database(entities = [(MyInfo::class)], version = 5)
abstract class MyInfoRoomDatabase: RoomDatabase() {
abstract fun myInfoDao(): MyInfoDAO
companion object {
private var INSTANCE: MyInfoRoomDatabase? = null
fun getInstance(context: Context): MyInfoRoomDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
MyInfoRoomDatabase::class.java,
"MyInfo"
).createFromAsset("MyInfo.db")
.fallbackToDestructiveMigration()
.build() // End Room Database Builder
INSTANCE = instance
} // End If Null
return instance
} // End Synchronized
} // End Get Instance
} // End Companion Object
} // End Database Abstract Class
您的问题可能不是没有应用插入,而是您看到的是,您的问题是由于版本号增加,以及 .fallbackToDestructiveMigration
和没有迁移找到了。
这会导致数据库被破坏,然后由于数据库不存在,它是从资产文件创建的,因此更改实际上被撤消了。
因此,如果有架构更改(对 @Entity 注释 class 所做的更改包含在定义为 @Database 注释的一部分的实体列表中),那么迁移应该提供对保留数据的现有数据库进行更改以进行版本更改(在您的情况下处理从版本 4 到版本 5 的模式更改)。另一种方法是使用 AutoMigrations(注意限制和要求),请参阅 https://medium.com/androiddevelopers/room-auto-migrations-d5370b0ca6eb
我正在开发一个 Android Jetpack Compose 项目,其中包含预填充的 Room 数据库。
读取数据库效果很好,但是...
当我插入一条新记录时,它不会持续到下一次我 运行 应用程序。 我没有使用 inMemoryDatabaseBuilder()。
我知道当应用程序在内存中时它可以工作,因为我可以在屏幕上看到结果,但是,一旦我停止应用程序,我的插入就会消失。我还检查了底层数据库文件,我的插入从未提交到数据库,无论是在 运行ning 还是在我关闭它之后。
我做错了什么?
感谢您的帮助!
这是我的用户界面中的语句,它向我的数据库添加了一个新人:
viewModel.insertMyInfo(newMyInfo)
它在内存中有效,但是我一退出应用程序,新添加的记录就消失了。
App Inspector LiveData 显示我添加的内容。
viewModel插入函数
fun insertMyInfo(myInfo: MyInfo) {
myInfoRepository.insertMyInfo(myInfo)
}
似乎只提交到内存,而不是磁盘。
DAO @Insert
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insertMyInfo(vararg myInfo: MyInfo)
我用 suspend
试过了,没区别
存储库功能
fun insertMyInfo(newMyInfo: MyInfo) {
coroutineScope.launch(Dispatchers.IO) {
myInfoDAO.insertMyInfo(newMyInfo)
}
}
数据库
@Database(entities = [(MyInfo::class)], version = 5)
abstract class MyInfoRoomDatabase: RoomDatabase() {
abstract fun myInfoDao(): MyInfoDAO
companion object {
private var INSTANCE: MyInfoRoomDatabase? = null
fun getInstance(context: Context): MyInfoRoomDatabase {
synchronized(this) {
var instance = INSTANCE
if (instance == null) {
instance = Room.databaseBuilder(
context.applicationContext,
MyInfoRoomDatabase::class.java,
"MyInfo"
).createFromAsset("MyInfo.db")
.fallbackToDestructiveMigration()
.build() // End Room Database Builder
INSTANCE = instance
} // End If Null
return instance
} // End Synchronized
} // End Get Instance
} // End Companion Object
} // End Database Abstract Class
您的问题可能不是没有应用插入,而是您看到的是,您的问题是由于版本号增加,以及 .fallbackToDestructiveMigration
和没有迁移找到了。
这会导致数据库被破坏,然后由于数据库不存在,它是从资产文件创建的,因此更改实际上被撤消了。
因此,如果有架构更改(对 @Entity 注释 class 所做的更改包含在定义为 @Database 注释的一部分的实体列表中),那么迁移应该提供对保留数据的现有数据库进行更改以进行版本更改(在您的情况下处理从版本 4 到版本 5 的模式更改)。另一种方法是使用 AutoMigrations(注意限制和要求),请参阅 https://medium.com/androiddevelopers/room-auto-migrations-d5370b0ca6eb