【问题标题】:Room Database query not returning data, even though there is data in the database房间数据库查询不返回数据,即使数据库中有数据
【发布时间】:2019-08-22 00:31:57
【问题描述】:

我在 DAO 类中使用此方法来访问数据库中的数据:

@Query("select * from location_search_results WHERE searchQuery = :query")
fun searchForLocation(query: String): LiveData<LocationSearchResponse>

我这样称呼它:

locationResponse = locationResponseDao.searchForLocation(query)
Log.d("db", locationResponse.value.toString())

然后我观察这个值:

    fun bindUI() = launch {
        val locationResults = locationViewModel.locationResponse
        val owner = viewLifecycleOwner

        locationResults.observe(owner, Observer {
            if (it == null) return@Observer

            initRecyclerView(it.features.toLocationSearchResultListItem())
        })
    }

我的问题是,每当我这样做时,观察者总是返回 null,即使数据库中有与查询匹配的数据。我也尝试过使用 select * from location_search_results 以防它是 searchQuery 参数的问题,但它也返回 null。

这是数据库的样子:

我是 Room 和 SQLite 的新手,非常感谢任何帮助。谢谢。

【问题讨论】:

  • locationResponse.value. 好吧,不要这样称呼它,使用observe
  • 你必须观察livedata,因为在执行Log.d时livedata的值仍然是null,那是因为android在不同的线程中运行查询
  • 我稍后会观察数据,它仍然为空,抱歉我已经编辑了帖子以澄清

标签: android sqlite kotlin android-room


【解决方案1】:

由于您是从房间查询返回 livedata,因此应该观察它以获取值。 就像是 : locationResponseDao.searchForLocation(query).observeForever{ 响应 -> locationResponse.value = 响应

}

【讨论】:

  • 我稍后会观察它,对于造成的混乱,我深表歉意。我已经用更多信息编辑了问题以澄清
  • 不,我的意思是你需要在视图模型中观察。查看我的更新答案
  • 这会改变它为空的事实吗?为什么改变观察者的位置会使返回的数据不同?合法地问,因为我有另一组类,它们基本上做同样的事情,它在片段类中有观察者,一切正常
  • 不,我说的是首先观察视图模型中的实时数据并更新对象。我没有说要删除片段观察者代码。基本上片段观察者观察从视图模型可变数据更新的视图模型实时数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-11
  • 1970-01-01
  • 1970-01-01
  • 2015-10-18
  • 1970-01-01
  • 2018-06-18
相关资源
最近更新 更多