如果不使用LiveData自动获取数据的变化,那么当每次数据库中的数据发生变化时,我们都要开启一个工作线程去重新获取数据库中的数据。
比如说,在进入页面时,要获取数据库中全部学生信息列表,一般我们会这么写:
thread{
studentList = studentDao.getStudentList() as MutableList<Student>
runOnUiThread {
arrayAdapter = ArrayAdapter(this,android.R.layout.simple_list_item_1,studentList)
listView.adapter = arrayAdapter
}
}
首先开个工作线程去获取数据库中存储的学生列表,然后再回到UI线程中进行界面更新。这样既不方便又有可能因为忘记开线程而造成的程序出错,但是,结合LiveData及ViewModel,就可以在数据发生变化时,通过LiveData组件通知View层,实现数据的自动更新。
要想实现这个功能,我们需要对程序做如下改动:
①修改学生表Dao文件。
这里我们希望当学生列表数据发生变化时,能够收到实时通知,因此,我们将getStudentList()方法的返回对象用LiveData包装起来。
package com.example.jetpacktest.room
import androidx.lifecycle.LiveData
import androidx.room.*
@Dao
interface StudentDao {
@Insert
fun insertStudent(student:Student)
@Delete
fun deleteStudent(student: Student)
@Update
fun updateStudent(student: Student)
@Query("SELECT * FROM student")
fun getStudentList():LiveData<List<Student>>
@Query("SELECT * FROM student WHERE id = :id")
fun getStudentById(id:Long):Student