1

I am developing in Adnroid RxJava with Room.

I use retrofit to call API and update the value in database like the following code:

    override fun certifyMail(userInfo: Userinfo): Observable<Int> {
        return securityApi.certifyUserInfo(userInfo)
            .map {
            //return Observable<Status> here
                when(it.status){
                    "OK" -> {
                        it
                    }
                    else -> {
                        throw Exception(it.msg!!)
                    }
                }
            }
            .flatMap {
                userInfoDataSource.updateUserCertifyMailInfo(userInfo.account,1)
            //How to convert the return type to Observable<Int> from Int.
            }
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
    }

When the response is OK from API, I will update the value in database like the following.

@Query("UPDATE certify_info SET value = :value  WHERE account = :account")
fun updateCertifyMailConfirm(account:String,value: Int):Int

But the return type of database is Int. How to covert it to Observable<Int> ?

Thanks in advance.

4

1 回答 1

1

Room 库可以返回 RxJava 的类型。

implementation "androidx.room:room-rxjava2:2.2.0-rc01"库添加到您的项目

查看这篇很棒的文章以获得更好的理解。

另请查看有关此的 Google 官方示例

只需updateUserCertifyMailInfo以其中一种方式编辑您的方法(选择更适合的一种):

与也许:

@Query("UPDATE certify_info SET value = :value  WHERE account = :account")
fun updateCertifyMailConfirm(account:String,value: Int):Maybe<Int>

单人:

@Query("UPDATE certify_info SET value = :value  WHERE account = :account")
fun updateCertifyMailConfirm(account:String,value: Int):Single<Int>

使用可流动/可观察的:

@Query("UPDATE certify_info SET value = :value  WHERE account = :account")
fun updateCertifyMailConfirm(account:String,value: Int):Flowable<Int>

重要的!仔细阅读每种类型在房间查询中的行为方式

于 2019-09-10T12:01:42.807 回答