gpt4 book ai didi

android - 有流的房间在空时返回 null

转载 作者:行者123 更新时间:2023-12-02 12:32:33 26 4
gpt4 key购买 nike

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

我的设置如下,通用T对于我的实际实体。

interface TDao {

@Query("SELECT * FROM Table WHERE date=:date")
fun getT(date: String): Flow<T>
}
@Singleton
class TRepository @Inject constructor(
private val apiService: TApiService,
private val Tdao: TDao
) {

suspend fun getTFor(date: String): Flow<T> =
Tdao
.getT(date)
.map {
if (it == null) {
returnTFromDatabase()
} else {
it
}
}

现在,当数据库没有任何 T在里面为 date ,我希望它返回一个空流,其中没有任何项目。相反,它有一个 null元素,这永远不会发生,因为 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)
}
}
}

...它通过了,因为,再次,有一个 null元素退回。

我错过了什么?这里有什么问题,因为我无法弄清楚。为什么我在具有不可为空元素的流中得到一个空元素?

最佳答案

Room 是一个用 Java 编写的数据库,这就是它忽略 Kotlin 可选的原因。我建议声明总是查询返回类型,或者,在你的情况下,Flow<T?>类型,可选。如果您不想在流程中使用空类型,可以使用 filterNotNull()像这样的功能:

Tdao.getT(date).filterNotNull()

关于android - 有流的房间在空时返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60551672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com