在
room
中,我有一个类似这样的方法:
@Dao
interface FacultyDao {
@Query("select * from faculty")
fun getAll(): LiveData<List<Faculty>>
...
}
在存储库中,我只是调用这个方法并记录它:
class FacultyRepository(application: Application) {
private val facultyDao: FacultyDao
init {
val db: AppDB = AppDB.getInstance(application)
facultyDao = db.facultyDao()
}
fun getAllFaculty(): LiveData<List<Faculty>> {
val v = facultyDao.getAll()
Log.d("muaxx", v.value.toString())
return v
}
...
}
但问题是它正在返回我
null
,但是当我在检查员中运行该查询时它起作用了。我错过了什么吗?
LiveData 不会立即具有初始值。 Room 查询数据库并在后台线程上获取结果。然后在主线程的 next 循环中,LiveData 的
value
将被设置为这个检索到的值。您登录 value
太早了。初始值将在未来某个时间出现,在此函数已经返回之后。
通常你应该只通过观察它来获得一个 LiveData 值。
直接检查
value
通常只应在您管理 MutableLiveData 并使用先前的值来帮助确定您要发布的下一个值时进行。
实时数据为我们提供了实时数据。所以,第一次,你自己还是没有一些。它正在等待数据库的响应。如果你想看到一些实时数据,你必须观察它,以便在收到信息后,会调用观察者并记录信息。
这是我所做的:
facultyRepository
内创建AndroidViewModel
的实例,像这样:private val facultyRepository = FacultyRepository(application)
faculties
)将结果存储在一些可变的实时数据中,如下所示:val faculties: MutableLiveData<List<Faculty>> = MutableLiveData(ArrayList())
init
的方法中,我正在使用 getAllFaculty
观察
observeForever
是的,我需要从片段中调用一次这个
init
方法。
相关代码:
class FacultyListViewModel(application: Application) : AndroidViewModel(application) {
private val facultyRepository = FacultyRepository(application)
val faculties: MutableLiveData<List<Faculty>> = MutableLiveData(ArrayList())
fun init() {
facultyRepository.getAllFaculty().observeForever {
faculties.postValue(it)
}
}
}
如果您有更好的方法,请随时在这里提出建议。