繁体   English   中英

Android和Room:插入作品,查询不

[英]Android and Room: inserting works, querying does not

我在项目中使用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()的返回类型从getAllBalances() Flowable<List<BalanceDataModel>>更改为Single<List<BalanceDataModel>>但一直在发生:没有结果。

我有一个PortfolioManager,从中调用以下方法,并从Fragment中传递观察者和所有者。

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())
    }

有人知道怎么了吗? 在此先多谢!

我刚刚看到了您最近的编辑。 我认为您的问题是您在getBalanceListPortfolio中返回了一个空列表。 该观察值未订阅。

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

我建议您将其转换为列表并返回此可观察到的内容(类似这样,无法尝试进行编译。我现在没有可工作的环境)。

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

将其包装为可观察对象,您可能想先将类型更改为可观察对象(而不是单个),以进行测试。 让我知道结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM