【发布时间】: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