【问题标题】:Android Room query not returning the LiveDataAndroid Room 查询不返回 LiveData
【发布时间】:2019-05-21 12:46:01
【问题描述】:

我正在尝试从 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;
      }
  }

【问题讨论】:

  • does not return results 是什么意思?您需要observe { LiveData 才能获得最终的结果。
  • 向我们展示您拨打getMyTransaction()getAllTransactions()的代码。
  • 我已经更新了这个问题。请结帐。
  • 正如EpicPandaForce所说:你必须observe()你的LiveData
  • @EpicPandaForce 我会尝试观察

标签: android android-room android-lifecycle


【解决方案1】:

LiveData 无法在不观察的情况下检索。这就是为什么下面的代码根本不起作用的原因。

LiveData<List<MyTransaction>> currentTransactions = mDao.getAllTransactions();

要使其正常工作,请先观察 LiveData,然后监听数据变化:

 mDao.getAllTransactions().observe(this, new Observer<List<MyTransaction>>() {
            @Override
            public void onChanged(List<MyTransaction> myTransactionList) {

            }
        });

【讨论】:

  • 是的。看来我错过了。我会尝试观察它,看看会发生什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多