Android room:LiveData 上的调用值可以用于return 纯数据吗?

Android room: Can calling value on LiveData be used to return plain data?

假设我有一个房间 DAO 函数 getForIdLiveData(id: String),其中 returns LiveData<SomeClass>

使用 someClassDAO.getForIdLiveData(id).value 而不是制作一个 returns 只是 SomeClass 的重复 DAO 函数是否节省(以及它在性能方面如何)?

这将节省大量样板代码(因为 DAO 函数通常通过 MVP 或 MVVM 中的存储库传递)并且到目前为止它似乎可以正常工作。我只是找不到太多关于我(当然)想避免的未来可能出现的并发症的信息。

示例:

我可以用这个吗:

someDataClassDAO

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForIdLiveData(id: String): LiveData<SomeDataClass>

MyRepo界面

    getMyInfoLiveData(id: String): LiveData<SomeDataClass>

在实现自定义接口的myRepoFactoryMyRepo

    @WorkerThread
    override fun getMyInfoLiveData(id: String)
        = someDataClassDAO.getForIdLiveData(id)

myViewModelclass

    // Provide LiveData for ongoing UI display
    fun provideMyInfoLiveData(id: String) = myRepo.getMyInfoLiveData(id)

    // Get some parameter for different id (one time)
    fun getOneParameter(id): Long {
        val entity = myRepo.getMyInfoLiveData(id).value
        return entity.someField
    }

而不是:

someDataClassDAO

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForIdLiveData(id: String): LiveData<SomeDataClass>

    @Query("SELECT * FROM my_table WHERE my_id = :id")
    fun getForId(id: String): SomeDataClass

MyRepo界面

    getMyInfoLiveData(id: String): LiveData<SomeDataClass>
    getMyInfo(id: String): SomeDataClass

在实现MyRepo

MyRepoFactory
    @WorkerThread
    override fun getMyInfoLiveData(id: String)
        = someDataClassDAO.getForIdLiveData(id)

    @WorkerThread
    override fun getMyInfo(id: String)
        = someDataClassDAO.getForId(id)

myViewModelclass

    // Provide LiveData for ongoing UI display
    fun provideMyInfoLiveData(id: String) = myRepo.getMyInfoLiveData(id)

    // Get some parameter for different id (one time)
    fun getOneParameterForId(id): Long {
        val entity = myRepo.getMyInfo(id)
        return entity.someField
    }

如果您需要两种变体(LiveData 和正常结果),ypu 应该在 DAO 中制作该方法的 2 个变体。其他一切都是黑客。

Is it save (and how is it performance-wise) to use someClassDAO.getForIdLiveData(id).value instead of making a duplicate DAO function which returns just SomeClass?

与"performance-wise"无关,完全行不通.

LiveData<T> 当有一个活跃的观察者时异步评估。

T同步求值并立即返回(I/O访问,阻塞)。

所以你只会得到 null 并且事情根本不起作用。你确实需要这两种方法。

我更喜欢称它们为 getForIdWithChanges 而不是 getForIdLiveData 考虑到你确实知道它是来自类型系统的 LiveData。