如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”
Posted
技术标签:
【中文标题】如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”【英文标题】:How to solve error : " Not sure how to handle insert method's return type" in implement room with RX java 【发布时间】:2019-11-20 02:36:20 【问题描述】:这是我在运行我使用Room
和RX java
开发的示例项目后出现的错误:
e: /home/milad/workspace/android/WalletMVVM/app/build/tmp/kapt3/stubs/debug/com/example/walletmvvm/data/dao/CurrencyDao.java:15: error: Not sure how to handle insert method's return type.
public abstract io.reactivex.Single<com.example.walletmvvm.data.model.CurrencyModel> insert(@org.jetbrains.annotations.NotNull()
我搜索了很多,但我没有找到任何东西。
我可以用RX java
实现Retrofit
并使用它,我可以用RX java
在其他线程中运行Room
查询,但我不能用@ 设置observer
和subscribe
observable
987654334@还没有。
一切都很好
这是我的Dao
:
@Dao
interface CurrencyDao
@Query("SELECT * FROM $DbConstants.TABLE_CURRENCY ORDER BY $DbConstants.NAME_CURRENCY_MODEL ASC")
fun getCurrencyList(): Observable<List<CurrencyModel>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(currencyModel: CurrencyModel): Single<CurrencyModel>
这是我的repository
:
companion object
// For Singleton instantiation
@Volatile
private var instance: CurrencyRepository? = null
fun getInstance(currencyDao: CurrencyDao) =
instance ?: synchronized(this)
instance ?: CurrencyRepository(currencyDao).also instance = it
fun getCurrencyList(): Observable<List<CurrencyModel>>?
return currencyDao.getCurrencyList()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
这是我的fragment
那我observer
的数据:
private fun initObservers()
val getCurrencyListObserver = currencyViewModel.getCurrencyLists()
getCurrencyListObserver?.subscribeWith(getCurrenciesFromDatabase())
private fun getCurrenciesFromDatabase() : Observer<List<CurrencyModel>>
return object : Observer<List<CurrencyModel>>
override fun onComplete()
override fun onSubscribe(d: Disposable)
override fun onNext(t: List<CurrencyModel>)
t.let
showResult(it.size.toString() + " items")
setRecyclerData(it)
binding.listSize = it.size
override fun onError(e: Throwable)
为了实现这一点,我研究了this in medium 并研究了this
我在googlesamples/android-architecture-components 看到了关于 Kotlin 的示例代码,但他们不使用观察者
更新:
因为在那之后我删除了single
我无法使用:
currencyDao.insert(currency)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe()
而currencyDao.insert(currency)
无法访问.subscribeOn()
等
更新:
当我将返回类型更改为Long
类型时我解决了这个问题,但我遇到了新的error
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(currencyModel: CurrencyModel): Single<Long>
新的错误是:
e: /home/milad/workspace/android/WalletMVVM/app/build/tmp/kapt3/stubs/debug/com/example/walletmvvm/data/dao/CurrencyDao.java:11: error: Not sure how to convert a Cursor to this method's return type (java.lang.Object).
public abstract io.reactivex.Observable<java.lang.Object> getCurrencyList();
更新:
我将 insert
返回类型更改为 Completable
并修复了
【问题讨论】:
为什么你的插入返回Single<CurrencyModel>
?
@Blackbelt,我把它改成了 Maybe 和 Observable 但我又遇到了那个错误!!
为什么要退货?
@Blackbelt,我更新了我的问题,因为我希望插入返回,但是当我将返回类型更改为 Long 类型时我解决了它,但我遇到了新错误
你可以使用Single.fromCallable
并让insert什么都不返回?
【参考方案1】:
你的:
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(currencyModel: CurrencyModel): Single<CurrencyModel>
应该返回 Completable
而不是 Single
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun insert(currencyModel: CurrencyModel): Completable
那是因为你的操作完成后不需要返回任何东西。它只是进入背景上的onComplete
块。
【讨论】:
返回Completable
而不是 Single
是的,谢谢,但它解决了我的第一个问题我更新了我的问题,我有新的错误
我在您的更新中没有看到 Completable
关键字以上是关于如何解决错误:使用 RX java 在实现室中“不确定如何处理插入方法的返回类型”的主要内容,如果未能解决你的问题,请参考以下文章
静态成员 rx 不能在实例类型 UICollectionView 上使用
导入开源库 java.lang.NoClassDefFoundError: rx.plugins.RxJavaPlugins