kotlin 如何从房间数据库的表中查询最小值?

inn6fuwd  于 2023-01-13  发布在  Kotlin
关注(0)|答案(1)|浏览(112)

我正在Kotlin中构建一个简单的体重跟踪应用程序,使用空间,我很坚韧找到资源来弄清楚如何查询和返回数据库中的一个值,而不返回我的整个数据类。
我知道我在我的刀中返回了一个列表,但是有人能告诉我如何在没有列表的情况下返回最小的权重吗?
我对房间还是个新手,所以任何帮助都很感激。
美岛

@Dao
interface WeightDao {

    @Query("SELECT * FROM weight")
    fun getAllWeightEntries():Flow<List<Weight>>

    This does returns the lowest weight entry but includes everything else from my data class
    @Query("SELECT * FROM weight WHERE weight_entry = (SELECT MIN(weight_entry) FROM weight)")
    fun getLowestWeightEntry():Flow<List<Weight>>

     My dataclass

    @Entity(tableName = "weight")
    data class Weight(
    @PrimaryKey(autoGenerate = true)
    val id: Int = 0,
    @ColumnInfo(name = "weight_entry")
    val weightEntry: Double,
    @ColumnInfo(name = "weight_entry_notes")
    val weightEntryNotes: String
    )

    Snippet from my viewmodel

      val lowestWeightEntry: LiveData<List<Weight>> = weightDao.getLowestWeightEntry().asLiveData()


    snippet from my u.i. fragment

      viewModel.lowestWeightEntry.observe(this.viewLifecycleOwner) { item ->
            item.let {
                binding.tvLowestWeightTest.text = item.toString()
            }
        }
5q4ezhmt

5q4ezhmt1#

我相信你可以使用以下方法:

@Query("SELECT min(weight_entry) FROM weight")
fun getAllWeightEntries():Flow<Double>
  • 也可以是String而不是Double(甚至是Int或Long......但您需要将其减少为整数值)

也就是说,如果输出是一个单列,您可以为该值使用适当的类型(只要它是Room直接支持的列类型之一(即不需要TypeConverter))。
显然,视图模型应该期望检索这种类型的值。

关于此主题的更多信息(非@Entity类型的POJO)

对于除单个值之外的任何值,除了在@Database注解的entries参数中定义的@Entity注解类(它告诉Room该类是一个表),您需要一个字段名与输出字段名匹配的POJO。
比如说你有

@Query("SELECT min(weight_entry) AS min, max(weight_entry) AS max FROM weight")
fun getAllWeightEntries():Flow<weightMinAndMax>

您可能会遇到POJO,例如:-

data class weightMinAndMax(
    val min: Double,
    val max: Int /* although should be Double */
)
  • AS为输出列提供别名(分别为min和max)以适应POJO字段(否则输出列将分别为min(weight_entry)和max(weight_entry))。
  • 还可以使用@ColumnInfo的name参数覆盖预期的输出列名

例如,您可以

@Query("SELECT min(weight_entry) AS mymin, max(weight_entry) AS mymax FROM weight")
fun getAllWeightEntries():Flow<weightMinAndMax>

您可能会遇到POJO,例如:-

data class weightMinAndMax(
    @ColumnInfo(name = "mymin")
    val min: Double,
    @ColumnInfo(name = "mymax")
    val max: Int /* although should be Double */
)

简而言之,对于Query的单值输出,Room不需要将输出列与字段名匹配。对于Query的多值输出,Room需要能够将输出值与接收对象中的相应字段关联起来。

相关问题