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>
在实现自定义接口的myRepoFactory
中MyRepo
@WorkerThread
override fun getMyInfoLiveData(id: String)
= someDataClassDAO.getForIdLiveData(id)
在myViewModel
class
// 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
class
// 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。
假设我有一个房间 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>
在实现自定义接口的myRepoFactory
中MyRepo
@WorkerThread
override fun getMyInfoLiveData(id: String)
= someDataClassDAO.getForIdLiveData(id)
在myViewModel
class
// 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
class
// 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。