Я разрабатываю простое приложение со списком покупок, используя модель 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
.