为什么此查询会在 Android Studio 中的应用程序检查的数据库检查器部分中起作用,而在房间查询中不起作用?

千刀队

我在本地 SQLite 数据库中有一个表,它的类如下:

@Entity(tableName = "table_bp_reading")
class BPReading(
    var systolicValue: Int = 120,
    var diastolicValue: Int = 80,
    var pulseValue: Int = 72,
    var timeStamp: String = getDateTimeStamp(),
    @PrimaryKey(autoGenerate = true) var pId: Int = 0
) {
...

Dao 的相关部分如下所示:

...
    @Query("SELECT * FROM table_bp_reading WHERE timeStamp BETWEEN :startDate AND :endDate")
    fun getReadingsByDateRange(startDate: String, endDate: String): Flow<List<BPReading>>
...

数据库检查器显示一个包含以下条目的表

在数据库检查器中运行以下查询:

SELECT * FROM table_bp_reading WHERE timeStamp BETWEEN '2021-09-18 00:00:00' AND '2021-09-18 23:59:59'

给出以下结果

但是,当我尝试使用以下方法观察数据时:

        bpReadingViewModel.bpReadingsByDate("2021-09-18 00:00:00", "2021-09-18 23:59:59").observe(viewLifecycleOwner, {
                bpReading ->
            bpReading.let {
                bpReadingsByDate = it
                if(it.isNotEmpty()) bindDBDataToScatterChart()
            }
        })

我这边没有显示任何数据,查询结果是一个空列表。

但是请注意,如果不使用带有时间的完整时间戳,我只使用日期字符串,例如“2021-09-18”:

        bpReadingViewModel.bpReadingsByDate("2021-09-18", "2021-09-18").observe(viewLifecycleOwner, {
                bpReading ->
            bpReading.let {
                bpReadingsByDate = it
                if(it.isNotEmpty()) bindDBDataToScatterChart()
            }
        })

我还将查询从之前给出的 Dao 更改为以下内容:

@Query("SELECT * FROM table_bp_reading WHERE DATE(timeStamp) BETWEEN :startDate AND :endDate")
fun getReadingsByDateRange(startDate: String, endDate: String): Flow<List<BPReading>>

它可以工作,并且会返回当天的 3 个条目。但是,一旦我更改了上面的日期范围,以在 2021-09-18 和 2021-09-19 之间进行过滤,它就会再次停止工作。

请帮忙,我对这里发生的事情感到很困惑。

编辑:这是来自 Repository 的相关调用:

    fun readingsByDateRange(s: String, e: String): Flow<List<BPReading>> =
        bpReadingDao.getReadingsByDateRange(e, s)

以及来自该类的 ViewModel 的相关调用:

    fun bpReadingsByDate(s: String, e: String): LiveData<List<BPReading>> =
        repository.readingsByDateRange(s, e).asLiveData()

这就是为什么它确实是 bpReadingsByDate,而不是 getReadingsByDateRane。抱歉,这是我在跨文件命名函数不一致的错误。

迈克

查询很好(经过测试),从您的评论和编辑的问题来看,您已经交换了开始和结束时间戳,这通常会导致没有选择任何内容。

所以,你应该改变bpReadingDao.getReadingsByDateRange(e, s)bpReadingDao.getReadingsByDateRange(s, e)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章