Android 具有流的房间在空时返回null
我刚刚开始研究Room、Coroutines和Flow,遇到了一些奇怪的事情:我期望的是一个空流,实际上其中有一个空项 我的设置如下,对于我的实际实体,使用genericAndroid 具有流的房间在空时返回null,android,kotlin,android-room,kotlin-coroutines,kotlin-flow,Android,Kotlin,Android Room,Kotlin Coroutines,Kotlin Flow,我刚刚开始研究Room、Coroutines和Flow,遇到了一些奇怪的事情:我期望的是一个空流,实际上其中有一个空项 我的设置如下,对于我的实际实体,使用genericT interface TDao { @Query("SELECT * FROM Table WHERE date=:date") fun getT(date: String): Flow<T> } …然后它通过了,因为再次返回了一个null项 我错过了什么?这里出了什么问题,因为我不太明白。为什
T
interface TDao {
@Query("SELECT * FROM Table WHERE date=:date")
fun getT(date: String): Flow<T>
}
…然后它通过了,因为再次返回了一个null
项
我错过了什么?这里出了什么问题,因为我不太明白。为什么我在一个包含不可为null元素的流中得到一个null元素?Room是一个用Java编写的db,这就是为什么它忽略Kotlin optional。我建议声明always query return type,或者在您的情况下,声明
Flow
type,可选。如果不想在流中使用null类型,可以使用如下函数:
Tdao.getT(date).filterNotNull()
文件室处理可空性的方式取决于您如何定义查询函数的返回类型。文件说:
- 当返回类型为
时,查询空表会引发空指针异常Flow
- 当返回类型为
时,查询空表会发出Flow
值null
- 当返回类型为
时,查询空表将发出空列表Flow
资料来源:上次我检查时,房间里的通用软件不太好用。另外,我建议您阅读一下Kotlin泛型。由于T没有上界,默认上界是
Any?
()它在我的代码中不是泛型的,我只是用T替换了对我实际实体的提及。它是我代码中的实际实体。@giorgosnokleus给定的T
可能不可为空,因此,将null
作为T
传递从来都不合适。你只要记住T
。
@RunWith(AndroidJUnit4::class)
class TDatabaseTest {
private lateinit var db: TDatabase
private lateinit var underTest: TDao
@Before
fun setUp() {
val context = InstrumentationRegistry.getInstrumentation().context
db = Room.inMemoryDatabaseBuilder(context, TDatabase::class.java).build()
underTest = db.TDao()
}
@After
fun tearDown() {
db.close()
}
@Test
fun givenEmptyDatabase_thenHasNoItems() {
runBlocking {
val list = underTest.getT("1999").take(1).toList()
assertEquals(1, list.size)
}
}
}
Tdao.getT(date).filterNotNull()