我正在使用MPAndroidChart
lib制作烛台图,并从Room
db获取数据。我将date : Date
,hr: Int
存储在数据库中。我试图得到指定日期间隔之间的结果。我写了一个查询,去"SELECT * FROM hr_data WHERE date BETWEEN :dateStart AND :dateEnd"
,但我总是得到null。我尝试将参数设置为Date
和long
,但结果仍然相同。
我使用类型转换器,所以在我的数据类我传递Date
类型的日期。
代码:
MyDao.kt
:
...
@Query("SELECT * FROM hr_data WHERE date BETWEEN :dateStart AND :dateEnd")
fun readHearRateBetweenDates(dateStart: Date, dateEnd: Date): LiveData<List<HeartRate>>
...
我已经更改为Long
而不是Date
和相同的结果。
Repository.kt
:
...
fun readHeartRateBetweenDates(dateStart: Date, dateEnd: Date) : LiveData<List<HeartRate>> = myDao.readHeartRateBetweenDates(dateStart, dateEnd)
...
HeartRateViewModel.kt
:
...
fun readHeartRateBetweenDates(dateStart: Date, dateEnd: Date) : LiveData<List<HeartRate>> = repository.readHeartRateBetweenDates(dateStart, dateEnd)
...
HeartRateActivity.kt
:
...
override fun onCreate(savedInstanceState: Bundle?) {
...
Log.i(TAG, "DATA - ${
viewModel.readHeartRateBetweenDates(
1628632376254,
1628692326964
).value
}"
}
viewModel.readHeartRateBetweenDates(1628632376254, 1628692326964).observe(this, Observer {
if (it.isNullOrEmpty()){
Log.i(TAG, "IS NULL OR EMPTY: $it")
} else
Log.i(TAG, "NOT NULL: $it")
})
...
我在控制台中打印出来只是为了看看结果,结果总是null
。
我已经检查了查询https://www.sqliteonline.com,它的工作原理,因为它返回两个结果。
当我读取所有数据时,因为它不需要任何参数,所以我只使用一个变量val readAllData : LiveData<List<HeartRate>> = repository.readAllData()
。我提到这个是因为如果我把我的日期之间的查询在一个我得到所有的数据,只是硬编码像"SELECT * FROM hr_data WHERE date BETWEEN 1628632376254 AND 1628692326964"
的值,我得到正确的结果。只有当我使用带参数的函数时,它才能得到null
您可以使用数据库检查器来检查您的数据库是否已填充(总是最好再次检查它)https://developer.android.com/studio/inspect/database
但是我相信你的问题是liveData。LiveData只会发出被观察到的值,所以当你调用
viewModel.readHeartRateBetweenDates (1628632376254,1628692326964) value
它总是返回null。
你应该做的是
viewModel.readHeartRateBetweenDates(1628632376254,1628692326964).observe(viewLifecycleOwner) {
//do whatever you want with the value returned
}