Room LiveData 未观察到插入和更新的更改

Room LiveData not observing changes on inserts and updates

提问人:Anchith Acharya 提问时间:6/19/2023 最后编辑:Anchith Acharya 更新时间:6/20/2023 访问量:51

问:

我在 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()
}

现在,我有一个(我不想使用 和 ,而且我没有使用片段或视图模型 - 我只想这是一个简单的应用程序)和一个列表视图的自定义。我想观察数据库的更改,以便每当它更改时,适配器都会更新并在屏幕上看到更改。这是我用来观察数据库的代码:ListViewMainActivityRecyclerViewViewHolderPostAdapter

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@UpsertonCreate

为什么会这样?我想要做的事情甚至可以在不使用 、 和 s 之类的东西的情况下实现吗?RecyclerViewFragmentViewModel

编辑:根据要求添加用于添加新帖子的代码段:

override fun onNotificationPosted(sbn: StatusBarNotification) {
    // val post = ...
    CoroutineScope(Dispatchers.IO).launch {
        notiDAO.addPost(post)
    }
}
安卓 Kotlin 列表视图 房间 安卓 直播数据

评论

2赞 darshan 6/19/2023
你能分享一下你是如何添加帖子的吗?
1赞 marcpetitvecino 6/20/2023
如果您想要一个肮脏的解决方案而不必考虑太多,只需在添加元素后再次删除并打印数据库即可
0赞 Anchith Acharya 6/20/2023
@Darshan我正在通知侦听器服务中添加帖子。我已经在问题中添加了代码。你的评论让我思考,在弄乱了代码之后,我发现这确实是问题的根源。如果我在MainActivity本身中添加帖子,那么它确实有效!但我无法弄清楚为什么它不能从服务中工作。
0赞 Aashis Shrestha 6/20/2023
@AnchithAcharya既然您尝试在服务上实现它,您是否尝试过使用挂起函数?
1赞 Anchith Acharya 6/24/2023
@AashisShrestha getAll 不能是挂起函数,因为它返回一个 LiveData 对象。有关更多详细信息,请参阅此处

答: 暂无答案