当前位置: 首页 > 知识库问答 >
问题:

Room+LiveData动态变化查询功能

伏默
2023-03-14

我正在做一个应该更新当前列表的应用程序。实现是使用room和livedata完成的,我使用的是mvp模式而不是ViewModel。我的问题是,如果我有一个查询返回所选类别中的所有项,并且我在livedata上已经有了一个observable,我是否可以用不同的查询参数更改dao函数并相应地更新列表。我找到的最接近它的东西是:Android Room LiveData select query parameters

override var itemsList: LiveData<List<Item>?> = 
itemDao.getItemsForCategory(1)
presenter.itemsList.observe(this, Observer {
    if (it != null) {
        itemAdapter.setTodoItems(it)
        itemListHolder.adapter =itemAdapter
    }
})
@Query("SELECT * FROM Item")
fun getItemsFromDatabase(): LiveData<List<Item>?>

@Query("SELECT * FROM Item WHERE category_id == :category_id ORDER BY 
creationTime ASC")
fun getItemsForCategory(category_id: Long): LiveData<List<Item>?>

解决方案是mutableLiveData,其中的值更改查询参数:

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
    itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}

这只是针对同一类别的查询,但使用不同的处理方式,任何事情都是可能的。

共有1个答案

须敏学
2023-03-14

编辑(解决方案)

解决方案是mutableLiveData,其中的值更改查询参数

override var itemsList: LiveData<List<IItem>?> = Transformations.switchMap(mutableLiveData) {
itemDao.getItemsForCategory(mutableLiveData.value!!.toLong())
}

override fun onItemsCalled(categoryId: Long) {
    when (mutableLiveData.value) {
        1 -> mutableLiveData.value = 2
        2 -> mutableLiveData.value = 3
        3 -> mutableLiveData.value = 4
        4 -> mutableLiveData.value = 1
    }
}
 类似资料:
  • 我无法使用category和date列获取行的ID。每当我使用LiveData观察方法更新我的时,观察方法都会在最后执行。 例如,代码: 这是Logcat的结果: 第一:ID:0 第三:ID: 0 日志::ID:0 第二:身份证1 为什么代码在

  • 本文向大家介绍MyBatis实现动态查询、模糊查询功能,包括了MyBatis实现动态查询、模糊查询功能的使用技巧和注意事项,需要的朋友参考一下 要实现查询,咱们就先有个数据库,截图如下,其中cityAreaId是外键,本次可以忽略; 下面Branches是我的实体类,里面有name和address属性; 接口中方法: MyBatis的接口映射文件的代码: 动态查询: 模糊查询: 然后就是main方

  • 问题内容: 我有一个存储在列表中的关键字列表。 要从表中获取记录,请使用以下查询: 您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作: 我在哪里犯错,或者应该怎么做? 问题答案: 您在这里做错了几件事: 您为所有参数赋予相同的名称。那行不通。参数需要唯一的名称。 您为每个项目创建一个新的SqlCommand。

  • 我读过这篇文章。 Room支持注释,以在运行时构造查询,例如代码A。 如果我使用代码B,当我完成它时,我会得到错误B。 似乎不支持返回,对吧? 代码A 代码B 错误B

  • 我试图从动态表中选择对象,但当我运行我的代码时,我得到了一些错误...有一种方法可以做到这一点...我用的是JPAHibernate和后遗症 这里是错误。。。 org.springframework.dao.InvalidDataAccessResourceUsageExc0019,"dedegMessage":"org.springframework.dao.InvalidDataAccessR