如何使用 Room 和 Android Rx 对同一查询实现不同类型的 return?
How to implement different kinds of return to the same query using Room and Android Rx?
我正面临这个问题。我正在使用 room 创建我的应用程序的本地数据库。假设我有一个实体调用用户和一个 UserDao。它看起来像这样:
@Dao
interface UserDao: BaseDao<User>{
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUser(remoteId : Long) : Single<User>
}
在这一点上没有什么奇怪的,但我想做的是能够改变这些函数中 return 的类型。我想要这个是因为有时我需要获得一个 Single 但在其他情况下我需要获得一个 Flowable。在这两种情况下,查询是相同的,唯一比 chagues 的是 return 的类型,我不想做这样的事情。
@Dao
interface UserDao: BaseDao<User>{
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUserSingle(remoteId : Long) : Single<User>
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUserFlowable(remoteId : Long) : Flowable<User>
}
知道如何以干净的方式做到这一点吗?
您可以只使用您的 Single<User>
并在其上调用 toFlowable()
。
你的 dao 对象上有类似 getUserSingle().toFlowable()
的东西。
编辑
你可以使用 flowable operator 并将其命名为 getUserFlowable.firstOrError()
。因为从文档
Returns a Single that emits only the very first item emitted by this Flowable or signals a {@link NoSuchElementException} if this Flowable is empty
像下面这样在 dao 界面中做一些更改
@Dao
interface AchivementDao {
@Query("SELECT * FROM Achivement") // pass your table name
fun getUserAchivement()=mutableListOf<Achivement>() // pass your pojo class name
@Query("SELECT * FROM Achivement WHERE id=:arg0")
fun getUserAchivement(id:Int):Achivement // pass your return object of class
}
我正面临这个问题。我正在使用 room 创建我的应用程序的本地数据库。假设我有一个实体调用用户和一个 UserDao。它看起来像这样:
@Dao
interface UserDao: BaseDao<User>{
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUser(remoteId : Long) : Single<User>
}
在这一点上没有什么奇怪的,但我想做的是能够改变这些函数中 return 的类型。我想要这个是因为有时我需要获得一个 Single 但在其他情况下我需要获得一个 Flowable。在这两种情况下,查询是相同的,唯一比 chagues 的是 return 的类型,我不想做这样的事情。
@Dao
interface UserDao: BaseDao<User>{
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUserSingle(remoteId : Long) : Single<User>
@Query("SELECT * FROM user WHERE remote_id = :remoteId")
fun getUserFlowable(remoteId : Long) : Flowable<User>
}
知道如何以干净的方式做到这一点吗?
您可以只使用您的 Single<User>
并在其上调用 toFlowable()
。
你的 dao 对象上有类似 getUserSingle().toFlowable()
的东西。
编辑
你可以使用 flowable operator 并将其命名为 getUserFlowable.firstOrError()
。因为从文档
Returns a Single that emits only the very first item emitted by this Flowable or signals a {@link NoSuchElementException} if this Flowable is empty
像下面这样在 dao 界面中做一些更改
@Dao
interface AchivementDao {
@Query("SELECT * FROM Achivement") // pass your table name
fun getUserAchivement()=mutableListOf<Achivement>() // pass your pojo class name
@Query("SELECT * FROM Achivement WHERE id=:arg0")
fun getUserAchivement(id:Int):Achivement // pass your return object of class
}