代码之家  ›  专栏  ›  技术社区  ›  noloman

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

  •  0
  • noloman  · 技术社区  · 6 年前

    我正在项目中使用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>
    }
    

    Insert的工作非常出色,但 getAllBalances() 方法不起作用,因为它不检索任何行。插入后我提取了DB,我可以看到那里的所有行; SELECT * from balance 在使用桌面应用程序对提取的DB进行本地执行时,可以完美地工作。 我还尝试更改 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)
                    })
        }
    

    在repository类中,我有:

    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 回复  |  直到 6 年前
        1
  •  1
  •   ColdFire    6 年前

    我刚看到你最近的编辑。我认为您的问题是您在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())
    

    这被包装为一个可观察的对象,您可能想首先将您的类型更改为可观察的(而不是单一的),只是为了测试。让我知道结果。