Room with Flow возвращает пустое значение, когда пусто - PullRequest
0 голосов
/ 05 марта 2020

Я только начал смотреть на Room, Coroutines и Flow, и натолкнулся на нечто странное: то, что я ожидаю, чтобы быть пустым потоком, на самом деле содержит один нулевой элемент.

Мои настройки выглядит следующим образом, с generi c 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 элемент.

Что мне не хватает? Что здесь не так, потому что я не могу понять это. Почему я получаю один нулевой элемент в потоке с ненулевыми элементами?

1 Ответ

2 голосов
/ 07 марта 2020

Комната - это дБ, записанная в Java, и поэтому она игнорирует Kotlin необязательно. Я предлагаю всегда объявлять тип возвращаемого запроса или, в вашем случае, Flow<T?> тип, необязательно. Если вам не нужен нулевой тип в потоке, вы можете использовать функцию filterNotNull(), например:

Tdao.getT(date).filterNotNull()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...