为啥此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作?

Posted

技术标签:

【中文标题】为啥此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作?【英文标题】:Why would this query work in the Database Inspector section of the App Inspection in Android Studio, but not within a Room Query?为什么此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作? 【发布时间】:2021-11-13 07:31:44 【问题描述】:

我的本​​地 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
) 
...

道的相关部分如下所示:

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

数据库检查器显示一个表格 the following entries.

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

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.

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

        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。对不起,这是我的错误,因为与跨文件命名函数不一致。

【问题讨论】:

可以发一下建表语句吗? 应该bpReadingViewModel.bpReadingsByDate(.... 不是bpReadingViewMode.getReadingsByDateRange(.... 吗? (使用 room 测试了您的查询,但没有 Flow,它工作正常,所以如果您应该使用 bpReadingsByDate,那么问题可能在于如何调用 getREadingsByDateRange @MikeT 我在问题中添加了一些细节。您认为 Flow 可能是问题所在吗? @avalerio 我正在使用 Room,我将如何提取创建语句,因为它是为我做的? 应该交换e和s吗?即你应该有 bpReadingDao.getReadingsByDateRange(s, e) 而不是 bpReadingDao.getReadingsByDateRange(e, s) 【参考方案1】:

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

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

【讨论】:

以上是关于为啥此查询可以在 Android Studio 中的 App Inspection 的 Database Inspector 部分工作,但不能在 Room Query 中工作?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SQLite 选择查询不能在应用程序中运行,而是在 Android Studio 上的 Database Inspector 上运行?

为啥我在 Android Studio 中收到此错误“Expected resource of type raw”?

为啥视图没有显示在 android studio 的设计中?

为啥我的Android studio里面没有Preview。在View-Tool Windows

为啥android studio向模拟器发送短信

android studio安装完为啥在桌面没有快捷方式