我希望将存储库响应作为吐司传播给用户,因此我将实时数据侦听器放在创建后方法的Activity中
mainViewModel.toast.observe(this) {
Log.d(TAG, "initViews: $it")
if (it.notPropagated) {
Toast.makeText(
this,
it.message,
if (!it.longToast) Toast.LENGTH_SHORT else Toast.LENGTH_LONG
).show()
mainViewModel.setMessageToPropagated()
}
}
吐司是从数据库中获取的流创建的简单活动数据
val toast = mainRepository.getMessage().asLiveData(viewModelWorkerContext)
但是当我尝试使用insert来更改数据库中其他片段中的数据时,它实际上不会在更改时更新,只有当我重新启动应用程序时,它才从数据库中获取内容,并响应mainViewModel.setMessageToPropagated()
,将消息更改为“used”,并触发livedata,没有问题。
@Dao
interface RoomDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun setMessage(message: SingleTimeUserMessage)
@Query("SELECT * FROM SingleTimeUserMessage WHERE notPropagated = true LIMIT 1")
fun getMessageToPropagate(): Flow<SingleTimeUserMessage>
@Query("SELECT * FROM SingleTimeUserMessage LIMIT 1")
fun getMessageToPropagated(): SingleTimeUserMessage
}
最后,供应商
@Module
@InstallIn(SingletonComponent::class)
object RoomDatabase {
@Provides
@Singleton
fun provideMainDatabase(app: Application): MainDatabase =
Room.databaseBuilder(app, MainDatabase::class.java, "MainDatabase")
.fallbackToDestructiveMigration()
.build()
@Singleton
@Provides
fun provideTvDao(database: MainDatabase): RoomDao {
return database.tvDao()
}
}
我读了很多关于这个问题的主题,它通常是通过让提供程序返回相同的数据库示例来解决的,但据我所知,我的提供程序应该总是返回相同的示例。任何想法和帮助都将不胜感激。
1条答案
按热度按时间wz8daaqr1#
在我的代码中有一个错误,我不知道是这样工作的。我在所有的存储库上都有无用的注解
取下后,一切似乎运行得很好。
希望这能帮助将来遇到类似问题的人。