【发布时间】: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