Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 具有流的房间在空时返回null_Android_Kotlin_Android Room_Kotlin Coroutines_Kotlin Flow - Fatal编程技术网

Android 具有流的房间在空时返回null

Android 具有流的房间在空时返回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项 我错过了什么?这里出了什么问题,因为我不太明白。为什

我刚刚开始研究Room、Coroutines和Flow,遇到了一些奇怪的事情:我期望的是一个空流,实际上其中有一个空项

我的设置如下,对于我的实际实体,使用generic
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()