Как устранить ошибку: «Не уверен, как обработать возвращаемый тип метода вставки» в комнате агрегата с RX Java - PullRequest
0 голосов
/ 10 июля 2019

Это моя ошибка, после этого я запускаю пример проекта, который я разработал с 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()

Я много искал, но не сделалнайти что-нибудь.

Я мог бы реализовать Retrofit с RX java и использовать его, и я мог бы выполнить Room Запрос в другом потоке с RX java, но я не смог установить observer и subscribea observable с RX java пока.

Все звучит хорошо

Это мой 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 данные:

@SuppressLint("CheckResult")
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

Я вижу пример кода о Kotlin в googlesamples / android-архитектура-компоненты , но они не используют наблюдатель


Обновление:

, потому что после этого я удаляю 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, и он исправил

1 Ответ

1 голос
/ 10 июля 2019

Ваш:

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(currencyModel: CurrencyModel): Single<CurrencyModel>

Должен вернуть Completable, а не Single

        @Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insert(currencyModel: CurrencyModel): Completable

Это потому, что нет необходимости возвращать что-либо, когда ваша операция завершена.Он просто входит в блок onComplete на заднем плане.

...