![](/img/trans.png)
[英]android room query method returning list but is wrongfully treated as LiveData
[英]Android Room query not returning the LiveData
我想从Android Room返回LiveData。 我将结果作为LiveData返回时遇到问题。
这是Dao
的摘录
@Query("SELECT * FROM transaction_table")
LiveData<List<MyTransaction>> getAllTransactions();
@Query("SElECT * FROM transaction_table")
List<MyTransaction> getMyTransaction();
getAllTransactions()
调用在没有异常的情况下运行,但不返回结果。 另一方面, getMyTransactions()
返回选择查询结果。
SDK Version: 23
Room Version: 2.1.0-beta01
编辑:
我在初始化时填充数据库以进行测试。 这是代码
private static class PopulateDbAsync extends AsyncTask<Void, Void, Void> {
private static final String TAG = "PopulateDbAsync";
private final TransactionDao mDao;
PopulateDbAsync(TransactionDatabase db) {
mDao = db.transactionDao();
}
@Override
protected Void doInBackground(Void... voids) {
mDao.deleteAll();
MyTransaction transaction = new MyTransaction();
transaction.setCardNumber("0123023403450456");
long result = mDao.insert(transaction);
Log.d(TAG, "doInBackground: " + String.format(Locale.US, "Result %d", result));
transaction = new MyTransaction();
transaction.setCardNumber("0123023403450457");
result = mDao.insert(transaction);
Log.d(TAG, "doInBackground: " + String.format(Locale.US, "Result %d", result));
LiveData<List<MyTransaction>> currentTransactions = mDao.getAllTransactions();
List<MyTransaction> txns = currentTransactions.getValue();
List<MyTransaction> transactions = mDao.getMyTransaction();
if(transactions != null) {
Log.d(TAG, "doInBackground: " + String.format(Locale.US, "Size = %d", transactions.size()));
}
return null;
}
}
如果不观察LiveData,则无法检索它。 这就是为什么以下代码根本不起作用的原因。
LiveData<List<MyTransaction>> currentTransactions = mDao.getAllTransactions();
要使其工作首先观察LiveData,然后监听数据更改:
mDao.getAllTransactions().observe(this, new Observer<List<MyTransaction>>() {
@Override
public void onChanged(List<MyTransaction> myTransactionList) {
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.