Room DAO 不断返回 NULL

问题描述 投票:0回答:3

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
但是当我在检查员中运行该查询时它起作用了。我错过了什么吗?

android kotlin android-room dao androidx
3个回答
1
投票

LiveData 不会立即具有初始值。 Room 查询数据库并在后台线程上获取结果。然后在主线程的 next 循环中,LiveData 的

value
将被设置为这个检索到的值。您登录
value
太早了。初始值将在未来某个时间出现,在此函数已经返回之后。

通常你应该只通过观察它来获得一个 LiveData 值。

直接检查

value
通常只应在您管理 MutableLiveData 并使用先前的值来帮助确定您要发布的下一个值时进行。


1
投票

实时数据为我们提供了实时数据。所以,第一次,你自己还是没有一些。它正在等待数据库的响应。如果你想看到一些实时数据,你必须观察它,以便在收到信息后,会调用观察者并记录信息。


0
投票

这是我所做的:

  • 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)
        }
    }
}

如果您有更好的方法,请随时在这里提出建议。

© www.soinside.com 2019 - 2024. All rights reserved.