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)
}
}
如标题所示,我正在尝试 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)
}
}