【问题标题】:How to get a specific Entity in Room如何在房间中获取特定实体
【发布时间】:2019-07-07 01:06:13
【问题描述】:

所以,我正在使用 Room 数据库来存储课程,并且我坚持使用返回具有我想要的名称(课程)的课程的方法,因为它总是返回 null。我已将我的数据库缩减为 2 门课程,课程变量为:

如上图所示,当我尝试使用 course = fun 获取存储库中的 CourseEnt(我可以在下面看到它存在)时,它返回一个带有空值的 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)
    }

    ...
}

【问题讨论】:

  • 您是否正在观察新的 LiveData 实例,您正在使用 getCourse 方法将其放入 singleCourse 属性中?如果您在该方法运行之前开始观察,则可能是您仍在观察查询空字符串的旧 LiveData 实例。作为调试步骤,我会尝试在getCourse 中以直接、阻塞的方式(即使用返回CoursesEnt? 的附加方法)获取课程,并查看以这种方式获得的值。
  • 是的,我正在观察我的 Fragment 上的 LiveData,并在使用 getCourse 后进行。关于调试步骤,正如我在问题中所说,返回 null 是 coursesDao.getCourse(str).value,我在存储库中调用它,它应该返回 CoursesEnt

标签: android kotlin android-room android-query


【解决方案1】:

阅读文档,liveData 在直接调用时总是返回 null,你必须观察 LiveData,Room 的结果值会在块中。这是一些使用示例

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

但如果你打电话给

val users = mViewModel.getAllUsers()

结果将为空

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-02
    • 1970-01-01
    • 2022-09-27
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多