Android и Room: вставка работает, запросов нет - PullRequest
0 голосов
/ 26 апреля 2018

Я использую Room в проекте, и у меня есть следующий интерфейс DAO:

@Dao
interface BalanceDao {
    @Query("SELECT * FROM balance")
    fun getAllBalances(): Flowable<List<BalanceDataModel>>

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insertBalanceList(balanceDataModelList: List<BalanceDataModel>): List<Long>
}

Вставка работает фантастически, но метод getAllBalances() не работает, так как он не получает ни одной строки. Я извлек базу данных после вставки, и я могу видеть все строки там; SELECT * from balance отлично работает при локальном выполнении на извлеченной БД с помощью приложения для настольного компьютера. Я также пытался изменить тип возвращаемого значения getAllBalances() с Flowable<List<BalanceDataModel>> на Single<List<BalanceDataModel>>, но происходит то же самое: никаких результатов.

У меня есть PortfolioManager, из которого я вызываю следующий метод и передаю наблюдателя и владельца из моего фрагмента.

fun getAllCoins(owner: LifecycleOwner, observer: Observer<List<Balance>>) {
        portfolioViewModel
            .balanceListLiveData
            .observe(owner, observer)
        return portfolioViewModel.getPortfolioCoins()
    }

Затем в PortfolioManager у меня есть доступ к ViewModel, из которого я вызываю следующий метод:

fun getPortfolioCoins() {
        coinRepository
                .getBalanceListPortfolio()
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribeBy(onSuccess = {
                    balanceListLiveData.postValue(it)
                })
    }

А в классе репозитория у меня есть это:

fun getBalanceListPortfolio(): Single<List<Balance>> {
        val converter = BalanceDataModelConverter()
        val balanceList = mutableListOf<Balance>()
        coinDatabase.balanceDao()
                .getAllBalances()
                .toObservable()
                .flatMapIterable { t: List<BalanceDataModel> -> t }
                .map { t: BalanceDataModel ->
                    {
                        val a: Balance = converter.fromFirstToSecond(t)
                        balanceList.add(a)
                    }
                }
        return Single.just(balanceList.toList())
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
    }

Кто-нибудь знает, что может быть не так? Заранее большое спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Я только что видел ваше недавнее редактирование. Я думаю, что ваша проблема в том, что вы возвращаете пустой список в getBalanceListPortfolio. Это наблюдаемое не было подписано.

coinDatabase.balanceDao()
            .getAllBalances()
            .toObservable()
            .flatMapIterable { t: List<BalanceDataModel> -> t }
            .map { t: BalanceDataModel ->
                {
                    val a: Balance = converter.fromFirstToSecond(t)
                    balanceList.add(a)
                }
            }

Я предлагаю вам преобразовать это в список и вернуть это наблюдаемое (что-то вроде этого, не могу попытаться скомпилировать. У меня сейчас нет рабочего env).

return coinDatabase.balanceDao()
            .getAllBalances()
            .toObservable()
            .flatMapIterable { t: List<BalanceDataModel> -> t }
            .map { t: BalanceDataModel -> converter.fromFirstToSecond(t) }
            .toList()
            .toObservable()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())

Это завернуто как наблюдаемое, и вы можете сначала изменить свой тип на Наблюдаемый (вместо одиночного), просто для тестирования. Дайте мне знать результаты.

...