Как получить конкретную сущность в комнате

введите здесь описание изображения

Итак, я использую базу данных Room для хранения курсов, и я застрял на методе, который возвращает курс с именем (курсом), которое я хочу, потому что он всегда возвращает ноль. Я уменьшил свою базу данных, чтобы иметь 2 курса с переменной курса как:

Как вы можете видеть на картинке выше, когда я пытаюсь получить CourseEnt в репозитории с помощью course = fun, который, как я вижу ниже, существует, он возвращает LiveData с нулевым значением вместо CourseEnt, который я хотел.

Любая идея о том, что я делаю неправильно или о том, что я должен изучить с помощью отладчика?

Вот код:

Организация:

@Entity(tableName = "courses_table")
data class CoursesEnt (@PrimaryKey val course: String, 
                                   val location: String, 
                                   val description: String,                           
                                   val difficulty: Double, 
                                   val distance: Double, 
                                   val photos: ListInt, 
                                   val category: String, 
                                   val activities: ListString)//ListString is a type converter that converts a String into a List<String> and vice-versa

ДАО:

@Dao
interface CoursesDao {

   @Query("SELECT * from courses_table ORDER BY course ASC")
    fun getAllCourses(): LiveData<List<CoursesEnt>>

   @Query("SELECT * FROM courses_table WHERE course LIKE :str")
    fun getCourse(str: String):LiveData<CoursesEnt>

   ...
}

Репозиторий:

class CoursesRepository(private val coursesDao: CoursesDao){

    val allCourses: LiveData<List<CoursesEnt>> = coursesDao.getAllCourses()
    var singleCourse: LiveData<CoursesEnt> = coursesDao.getCourse("")

    @WorkerThread
    fun getCourse(str: String) {

        singleCourse = coursesDao.getCourse(str)
    }

    ...
}

person Migaloco    schedule 07.07.2019    source источник
comment
Наблюдаете ли вы за новым экземпляром LiveData, который вы помещаете в свойство singleCourse с помощью метода getCourse? Если вы начнете наблюдение до запуска этого метода, возможно, вы все еще наблюдаете за старым экземпляром LiveData, который запросил пустую строку. В качестве шага отладки я бы попытался получить курс прямым, блокирующим способом (т. е. с дополнительным методом, который возвращает CoursesEnt?) внутри getCourse и посмотреть на значение, которое вы получите таким образом.   -  person zsmb13    schedule 07.07.2019
comment
Да, я наблюдаю за LiveData в своем фрагменте и делаю это после использования getCourse. Что касается шага отладки, как я сказал в своем вопросе, то, что возвращается как null, — это coursesDao.getCourse(str).value, который я вызываю в своем репозитории, который должен возвращать CoursesEnt   -  person Migaloco    schedule 07.07.2019


Ответы (1)


Прочитайте документацию, liveData всегда будет возвращать null для прямого вызова, вы должны соблюдать LiveData, значение результата из комнаты будет в блоке. Это пример использования

mViewModel.getAllUsers().observe( this@YourActivity, Observer {
        // it - is all users from DB
    })

но если ты позвонишь

val users = mViewModel.getAllUsers()

результат будет нулевым

person Alexandr Kolesnik    schedule 06.08.2019