Android and 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>
}
Insert 非常有效,但是 getAllBalances()
方法不起作用,因为它不检索任何行。我在插入后提取了数据库,我可以看到那里的所有行; SELECT * from balance
使用桌面应用程序在本地对提取的数据库执行时完美运行。
我还尝试将 getAllBalances()
的 return 类型从 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)
})
}
在存储库 class 中,我有这个:
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())
}
有人知道哪里出了问题吗?非常感谢!
我刚刚看到你最近的编辑。我认为您的问题是您 return 在 getBalanceListPortfolio 中创建了一个空列表。未订阅此可观察对象。
coinDatabase.balanceDao()
.getAllBalances()
.toObservable()
.flatMapIterable { t: List<BalanceDataModel> -> t }
.map { t: BalanceDataModel ->
{
val a: Balance = converter.fromFirstToSecond(t)
balanceList.add(a)
}
}
我建议您将其转换为列表和 return 这个可观察对象(像这样的东西,无法尝试编译。我现在没有可用的环境)。
return coinDatabase.balanceDao()
.getAllBalances()
.toObservable()
.flatMapIterable { t: List<BalanceDataModel> -> t }
.map { t: BalanceDataModel -> converter.fromFirstToSecond(t) }
.toList()
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
这被包装为一个可观察对象,您可能想先将类型更改为可观察对象(而不是单一类型),只是为了测试。让我知道结果。
我在项目中使用 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()
方法不起作用,因为它不检索任何行。我在插入后提取了数据库,我可以看到那里的所有行; SELECT * from balance
使用桌面应用程序在本地对提取的数据库执行时完美运行。
我还尝试将 getAllBalances()
的 return 类型从 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)
})
}
在存储库 class 中,我有这个:
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())
}
有人知道哪里出了问题吗?非常感谢!
我刚刚看到你最近的编辑。我认为您的问题是您 return 在 getBalanceListPortfolio 中创建了一个空列表。未订阅此可观察对象。
coinDatabase.balanceDao()
.getAllBalances()
.toObservable()
.flatMapIterable { t: List<BalanceDataModel> -> t }
.map { t: BalanceDataModel ->
{
val a: Balance = converter.fromFirstToSecond(t)
balanceList.add(a)
}
}
我建议您将其转换为列表和 return 这个可观察对象(像这样的东西,无法尝试编译。我现在没有可用的环境)。
return coinDatabase.balanceDao()
.getAllBalances()
.toObservable()
.flatMapIterable { t: List<BalanceDataModel> -> t }
.map { t: BalanceDataModel -> converter.fromFirstToSecond(t) }
.toList()
.toObservable()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
这被包装为一个可观察对象,您可能想先将类型更改为可观察对象(而不是单一类型),只是为了测试。让我知道结果。