【问题标题】:Android room: Can calling value on LiveData be used to return plain data?Android 房间:LiveData 上的调用值可以用来返回纯数据吗?
【发布时间】:2019-01-30 02:12:15
【问题描述】:

假设我有一个房间 DAO 函数 getForIdLiveData(id: String),它返回 LiveData<SomeClass>。

使用someClassDAO.getForIdLiveData(id).value 而不是创建一个只返回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>

在实现自定义接口MyRepo的myRepoFactory中

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

在myViewModel 类中

    // 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)

在myViewModel 类中

    // 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
    }

【问题讨论】:

  • 您能否再解释一下这个问题?你想让你的 DAO 返回纯数据而不是 LiveData?
  • 是的,无需通过 repo 重新路由另一个函数。我添加了示例

标签: android kotlin android-room android-livedata


【解决方案1】:

使用是否节省(以及性能如何) someClassDAO.getForIdLiveData(id).value 而不是复制 只返回 SomeClass 的 DAO 函数?

这与“性能方面”无关,它只是完全行不通。

LiveData&lt;T&gt; 在有活动的观察者时被异步评估。

T 被同步评估并立即返回(I/O 访问、阻塞)。

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-24
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多