Должен ли я использовать LiveData для чтения запроса из базы данных комнаты в Android - Kotlin - PullRequest
0 голосов
/ 08 мая 2020

Я разрабатываю простое приложение со списком покупок с использованием модели MVVM.

У меня есть эти файлы:

  • Database (2 таблицы: товар для покупок и элемент ссылки) + DAO (уникальный)
  • Repository (Уникальный)
  • ViewModel (Уникальный)
  • Fragment / Activity

В DAO я определяю все свои запросы. В настоящее время все мои //Custom запросы возвращают тип LiveData<>, например:

@Dao
interface ShoppingDao {

    // Shopping Items
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insertShoppingItem(item: ShoppingItem)

    @Delete
    suspend fun deleteShoppingItem(item: ShoppingItem)

    @Update
    suspend fun updateShoppingItem(item: ShoppingItem)

    @Query(value = "DELETE FROM shopping_items")
    suspend fun deleteAllShoppingItems()

    @Query(value = "SELECT * FROM shopping_items")
    fun getAllShoppingItem(): LiveData<List<ShoppingItem>>

    // Custom
    @Query(value = "SELECT COALESCE(SUM(item_amount),0) FROM shopping_items")
    fun getAllShoppingCount(): LiveData<Int>

    @Query(value = "SELECT COALESCE(SUM(item_total_price), 0.0) FROM shopping_items")
    fun getAllShoppingTotal(): LiveData<Float>

Тогда в репозитории ни один из них не использует suspend fun для вызова. Таким образом, в ViewModel они также не используют suspend fun для вызова.

Я бы хотел использовать getAllShoppingCount(), например, без использования LiveData с Observer.

Возможно ли?

Это лучшая практика?

Без LiveData мне придется использовать suspend fun для выполнения моего Query, но когда я использую:

fun updateShoppingItem(item: ShoppingItem) = CoroutineScope(Dispatchers.Main).launch {
    repository.updateShoppingItem(item)
}

Он возвращает Job не тот тип, который должен возвращать Query. Как я могу это изменить, если я могу использовать что-то еще, кроме LiveData.

1 Ответ

1 голос
/ 08 мая 2020

Мои мысли:

  1. Нет ограничения «вы должны использовать LiveData в комнате». Есть «вы можете использовать LiveData» ( ссылка на документацию ). Также вы можете использовать другие техники, реализующие паттерн Observer - Rx Java, Coroutines Flow . Вы можете использовать один из этих механизмов для достижения реактивного потока в ваших данных - что-то меняется в локальной БД, ваш фрагмент / действие мгновенно заметит это изменение.
  2. Нет ограничения «вы не должны использовать LiveData в комнате». В упомянутой статье был просто ответ - «Если вы не хотите использовать LiveData - ну, тогда не стоит». Возможно, есть тенденция к замене LiveData в Kotlin на Coroutines Flow, но сейчас это не требует.
  3. Вы также можете использовать асинхронные Coroutines . В этом случае вы не заметите изменений в своем db. В вашей модели viewModel вы вызываете свою приостановленную функцию проще с помощью KTX extension

    viewModelScope.launch(Dispatchers.IO) { repository.updateShoppingItem(item) }

  4. Но что именно использовать, есть слишком много «ты можешь использовать это» и «ты можешь использовать то»? Ну, как обычно - смотря по обстоятельствам, и единого best-метода нет, а «если» много. Если вам не нужно наблюдать за изменениями данных в режиме онлайн, вы используете Kotlin и знакомы с сопрограммами - вы можете их использовать. Если вы используете Java в этом случае, и вы не знакомы с Rx Java и не хотите его изучать (все же почему?), Вам нужно вручную переместить весь ваш код, работающий с db, в другой поток . Если вы поклонник Rx Java - вы можете использовать его, даже если используете Kotlin. Если вы поклонник Rx Java, но хотите быть в курсе тенденций - вы можете использовать Flow.

Надеюсь, это поможет.

...