首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个查询可以在Android Studio的App Inspection的Database Inspector部分中工作,而不能在Room Query中工作?

为什么这个查询可以在Android Studio的App Inspection的Database Inspector部分中工作,而不能在Room Query中工作?
EN

Stack Overflow用户
提问于 2021-09-19 03:31:55
回答 1查看 86关注 0票数 1

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

代码语言:javascript
复制
@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的相关部分如下所示:

代码语言:javascript
复制
...
    @Query("SELECT * FROM table_bp_reading WHERE timeStamp BETWEEN :startDate AND :endDate")
    fun getReadingsByDateRange(startDate: String, endDate: String): Flow<List<BPReading>>
...

数据库检查器显示一个包含the following entries的表。

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

代码语言:javascript
复制
SELECT * FROM table_bp_reading WHERE timeStamp BETWEEN '2021-09-18 00:00:00' AND '2021-09-18 23:59:59'

Gives the following result

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

代码语言:javascript
复制
        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":

代码语言:javascript
复制
        bpReadingViewModel.bpReadingsByDate("2021-09-18", "2021-09-18").observe(viewLifecycleOwner, {
                bpReading ->
            bpReading.let {
                bpReadingsByDate = it
                if(it.isNotEmpty()) bindDBDataToScatterChart()
            }
        })

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

代码语言:javascript
复制
@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的相关调用:

代码语言:javascript
复制
    fun readingsByDateRange(s: String, e: String): Flow<List<BPReading>> =
        bpReadingDao.getReadingsByDateRange(e, s)

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

代码语言:javascript
复制
    fun bpReadingsByDate(s: String, e: String): LiveData<List<BPReading>> =
        repository.readingsByDateRange(s, e).asLiveData()

这就是为什么它确实是bpReadingsByDate,而不是getReadingsByDateRane。对不起,这是我的错误,因为我在文件中命名函数时并不一致。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-19 05:05:38

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

因此您应该将bpReadingDao.getReadingsByDateRange(e, s)更改为bpReadingDao.getReadingsByDateRange(s, e)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69240058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档