как выполнять запрос к базе данных каждый раз при загрузке активности - Kotlin (Android Room)
У меня есть приложение в котором есть две активности:
MainActivity- здесь я показываю все списки продуктовProductsList- здесь я показываю все продукты конкретного списка
Когда я запускаю приложение и первый раз открываю какой нибудь список то все продукты в этом списке я получаю правильные. Но вот когда я дальще возвращаюсь в MainActivity и открываю другой список то продукты все показываються со списка который был открыт как первый после загрузки приложения, и больше я никогда немогу обновить список продуктов.
Вот класс с самый запросом к базе данных:
@Dao
interface ProductListDao {
@Query("SELECT * FROM product_lists WHERE id_list = :selected_list_id ORDER BY id ASC")
fun getOrderedProductLists(selected_list_id: Int): Flow<List<ProductList>>
@Insert
fun insert(productList: ProductList)
@Query("DELETE FROM product_lists")
fun deleteAll()
}
Вот репозиторий продуктов:
class ProductListRepository(private val productListDao: ProductListDao) {
// ShoppingListApplication.id = айди открытого списка
val productLists: Flow<List<ProductList>> = productListDao.getOrderedProductLists(ShoppingListApplication.id)
@Suppress("RedundantSuspendModifier")
@WorkerThread
suspend fun insert(productList: ProductList) {
productListDao.insert(productList)
}
}
Активность ProductsList:
class ProductsList : AppCompatActivity() {
private val productListViewModel: ProductListViewModel by viewModels {
ProductListViewModelFactory((application as ShoppingListApplication).repositoryProduct)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_products_list)
Log.d("qqq", "(products list) selectedId: " + ShoppingListApplication.id + "\n")
val recyclerView = findViewById<RecyclerView>(R.id.recyclerview_products_list)
val adapter = ProductListAdapter()
recyclerView.adapter = adapter
recyclerView.layoutManager = LinearLayoutManager(this)
productListViewModel.productLists.observe(this) { words ->
words.let { adapter.submitList(it) }
}
}
}
Ответы (1 шт):
Свойство productLists инициализировано единственным значением, которое никогда не меняется. То есть запрос формируется при создании репозитория с тем значением ShoppingListApplication.id, которое было на тот момент. А теперь вопрос - зачем хранить Flow в свойстве репозитория, если он нужен только во второй активности и только во время её существования?
Следует заменить свойство на функцию - тогда запрос будет формироваться при каждом её вызове:
fun productLists(): Flow<List<ProductList>> = productListDao.getOrderedProductLists(ShoppingListApplication.id)
P.S. Передавать id через глобальные переменные тоже как-то неправильно - вместо этого следует передать его через интент и уже вторая активность запросит конкретно то, что ей нужно даже если она была убита и восстановлена (после сворачивания приложения). Следовательно функция должна принимать id из вызывающего кода.
fun productLists(id: Int): Flow<List<ProductList>> = productListDao.getOrderedProductLists(id)