Select 单列值作为实时数据

Select single column value as livedata

如标题所示,我正在尝试 select 我的数据库中的单个列作为实时数据。但是我收到以下错误消息。

error: Not sure how to convert a Cursor to this method's return type (androidx.lifecycle.LiveData<java.lang.Float>)

我正在跟踪手机位置并将位置 objects 插入名为 LocationEntity 的 table。

我的实体如下所示

data class LocationEntity(
...
    val speed: Float,
...
    @PrimaryKey(autoGenerate = true) val id: Long = 0
)

我的 DAO 如下所示

private const val ACCURACY_THRESHOLD = 50
private const val speedSql = """
    SELECT speed
    FROM LocationEntity
    WHERE runId = :runId AND accuracy < $ACCURACY_THRESHOLD
    ORDER BY dateTime
    DESC LIMIT 1
"""

@Dao
interface LocationDao {
...
    @Query(speedSql)
    suspend fun speed(runId: Long): LiveData<Float>
}

关于我做错了什么的任何线索?

suspend 和 LiveData 不能一起工作。以下作品。

@Dao
interface LocationDao {
...
    @Query(speedSql)
    fun speed(runId: Long): LiveData<Float>
}

实际上我认为 LiveData 开箱即用,返回 LiveData 时没有理由使用协程。

当使用 LiveData 时,它已经在后台线程上处理它。如果不使用 LiveData,那么在这种情况下,您可以使用协程(也许最终是协程通道)或 RxJava 等。

您可能会在 google codelab

中找到有关使用实时数据插入数据的信息

最有趣的部分是下面的代码

@Dao
interface WordDao {

    @Query("SELECT * from word_table ORDER BY word ASC")
    fun getAllWords(): LiveData<List<Word>>

    @Insert
    suspend fun insert(word: Word)

    @Query("DELETE FROM word_table")
    fun deleteAll()
}

class WordRepository(private val wordDao: WordDao) {

    val allWords: LiveData<List<Word>> = wordDao.getAllWords()

    @WorkerThread
    suspend fun insert(word: Word) {
        wordDao.insert(word)
    }
}