Как передать параметры запросу в Dao из репозитория?

#android #kotlin

#Android #kotlin

Вопрос:

Код Dao:

     @Query("SELECT * FROM word_table WHERE transaction_date BETWEEN :from_date AND :to_date")
    fun findTransactionsBetweenDates(from_date: Long, to_date: Long): LiveData<List<Word>>
  

Код репозитория:

     public var  from_date: Long = 0
    public var to_date: Long = 0

    val allWordsByDates: LiveData<List<Word>> = wordDao.findTransactionsBetweenDates(from_date, to_date)

   @Suppress("RedundantSuspendModifier")
   @WorkerThread
    suspend fun WordsByDates(from_date:Long, to_date:Long): LiveData<List<Word>>  {
        return  wordDao.findTransactionsBetweenDates(from_date, to_date)
    }
  

Я предполагаю наблюдать allWordsByDates из MyMainActivity, оттуда я вызываю функцию WordsByDates через ViewModel с датами from и to, но они никогда не меняются в репозитории, они всегда равны 0. Я попытался изменить from_date и to_date внутри функции WordsByDates, но это не сработало, моей последней попыткой было присвоить возвращаемое значение функции WordsByDates allWordsByDates, но это тоже не сработало. Любая помощь с кодом будет оценена.

Ответ №1:

похоже, что список не является статическим и изменяется при выборе, поэтому я бы изменил репозиторий следующим образом:

     private val allWordsByDatesMLD = MutableLiveData<List<Word>>()
    val allWordsByDates: LiveData<List<Word>> = allWordsByDatesMLD

    @WorkerThread
    suspend fun WordsByDates(from_date: Long, to_date: Long) {
        allWordsByDatesMLD.postValue(wordDao.findTransactionsBetweenDates(from_date, to_date))
    }
  

для работы с Dao, как это

     @Query("SELECT * FROM word_table WHERE transaction_date BETWEEN :from_date AND :to_date")
   suspend fun findTransactionsBetweenDates(from_date: Long, to_date: Long): List<Word>
  

Комментарии:

1. Это сработало! Вы понятия не имеете, насколько ваше решение помогло мне для этого экземпляра и других. Спасибо миллион. По-видимому, я не могу пометить его как правильный ответ, потому что у меня репутация менее 15.