尝试下面的代码,
我想从具有金额表的收入表中获取总收入金额
@ColumnInfo(name = "Amount")
private int amount;
并且在我的IncomeDao中,我>]
@Query("SELECT SUM(amount) from income_table") Integer getTotalIncomeAmount();
并且在我的收入库中]
public Integer getTotalIncomeAmount() { return incomeDao.getTotalIncomeAmount(); }
在我的IncomeViewModel中
public Integer getTotalIncomeAmount() { return incomeRepository.getTotalIncomeAmount(); }
而且我在主线程中这样称呼它
totalIncome = incomeViewModel.getTotalIncomeAmount();
但是它给我一个错误'无法访问主线程上的数据库,因为它可能长时间锁定UI。'
我知道可以通过创建
LiveData<Integer> getTotalIncomeAmount()
来消除此错误。但是我不想通过LiveData
来执行此操作,因为我必须观察到它对我而言不是很好。
[我希望有人向我展示如何在我的AsyncTask
类中创建此方法的IncomeRepository
,因为我知道这是摆脱此错误的唯一方法。我在编程方面还很陌生。当我在AsyncTask
]中创建其他类似的IncomeRepository
private static class UpdateIncomeAsyncTask extends AsyncTask<Income, Void, Void> { private IncomeDao incomeDao; private UpdateIncomeAsyncTask(IncomeDao incomeDao) { this.incomeDao = incomeDao; } @Override protected Void doInBackground(Income... incomes) { incomeDao.update(incomes[0]); return null; } }
我只需要一个人来完成
private static class TotalIncomeAmountAsyncTask extends AsyncTask<Void, Void, Void>
为了我。我非常努力,但我可以成功。在此先感谢我想从我的收入表中获得总收入,该收入表具有Amount表@ColumnInfo(name =“ Amount”)私有int量;在我的IncomeDao中,我已经@Query(“ SELECT SUM(amount)from ...
尝试下面的代码,
您将从数据库中的doInBackgroud
方法中获得金额,获得价值后,您将在onPostExecute
方法中获得调用。如果您具有全局变量,则可以直接在doInBackgroud
方法中设置值。
private void getTotalIncomeAmount() {
class TotalIncomeAmountAsyncTask extends AsyncTask<Void, Void, Integer> {
@Override
protected Integer doInBackground(Void... voids) {
Integer value = DatabaseClient.getInstance(getApplicationContext()).getAppDatabase()
.taskDao()
. getTotalIncomeAmount();
return value;
}
@Override
protected void onPostExecute(Integer value) {
super.onPostExecute(value);
//
}
}
TotalIncomeAmountAsyncTask totalIncome = new TotalIncomeAmountAsyncTask();
totalIncome.execute();
}
尝试下面的代码,