как выполнять запрос к базе данных каждый раз при загрузке активности - Kotlin (Android Room)

У меня есть приложение в котором есть две активности:

  1. MainActivity - здесь я показываю все списки продуктов
  2. 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 шт):

Автор решения: woesss

Свойство 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)
→ Ссылка