提问人:Anchith Acharya 提问时间:6/19/2023 最后编辑:Anchith Acharya 更新时间:6/20/2023 访问量:51
Room LiveData 未观察到插入和更新的更改
Room LiveData not observing changes on inserts and updates
问:
我在 Kotlin 中设置了一个简单的 ROOM 实例,如下所示:
型:
@Entity(tableName = "postinfo")
data class PostInfo(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
var title: String? = null,
var content: String? = null
): java.io.Serializable
分贝:
@Database(entities = [PostInfo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun postInfoDao(): PostInfoDAO
}
道:
@Dao
interface PostInfoDAO {
companion object {
const val tableName = "postinfo"
}
@Query("SELECT * FROM $tableName")
fun getAll(): LiveData<List<PostInfo>>
@Insert
suspend fun addPost(postInfo: PostInfo)
@Query("SELECT COUNT(*) FROM $tableName")
suspend fun getPostCount(): Int
@Query("DELETE FROM $tableName WHERE rowid in (select rowid FROM $tableName LIMIT 1)")
suspend fun deleteFromTop()
@Query("DELETE FROM $tableName")
fun clear()
}
现在,我有一个(我不想使用 和 ,而且我没有使用片段或视图模型 - 我只想这是一个简单的应用程序)和一个列表视图的自定义。我想观察数据库的更改,以便每当它更改时,适配器都会更新并在屏幕上看到更改。这是我用来观察数据库的代码:ListView
MainActivity
RecyclerView
ViewHolder
PostAdapter
val adapter = PostAdapter(this)
binding.listView.adapter = adapter
notiDAO.getAll().observe(this) { // 'this' is the MainActivity context
runOnUiThread {
adapter.clear()
adapter.addAll(it)
adapter.notifyDataSetChanged()
}
}
仅当我清除数据库或使用 .但是每当我在数据库中插入新记录时,观察者都不会被触发,列表视图也不会更新(我也用 和 进行了测试,这些也不起作用)。观察器中的代码仅在我在声明观察者或删除帖子时在开始时运行,而不是在添加新帖子时运行。notiDAO.deleteFromTop()
@Update
@Upsert
onCreate
为什么会这样?我想要做的事情甚至可以在不使用 、 和 s 之类的东西的情况下实现吗?RecyclerView
Fragment
ViewModel
编辑:根据要求添加用于添加新帖子的代码段:
override fun onNotificationPosted(sbn: StatusBarNotification) {
// val post = ...
CoroutineScope(Dispatchers.IO).launch {
notiDAO.addPost(post)
}
}
答: 暂无答案
评论