如何使用 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

}