【问题标题】:Firebase Cloud Firestore: Query isn't updating ArrayList in AndroidFirebase Cloud Firestore:查询未更新 Android 中的 ArrayList
【发布时间】:2020-02-12 17:44:48
【问题描述】:

我正在使用以下查询:

db.collection("Example")
                .whereEqualTo("UserId", currentUser.getUid())
                .orderBy("timestamp", Query.Direction.ASCENDING)
                .get()
                .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()){
                            for (QueryDocumentSnapshot document : task.getResult()){
                                Log.i(TAG, "onComplete: " + document.get("UserId") + " => " + document.get("userText"));
                                userIdArrayList.add(document.get("UserId").toString());
                                userTextArrayList.add(document.get("userText").toString());

                            }
                        }else{
                            Log.i(TAG, "onComplete: Error getting documents", task.getException());
                        }
                    }
                });

由于查询正在遍历结果,我希望它将结果添加到数组中。但是,当我运行代码并尝试打印数组列表的内容时,我得到了 IndexOutOfBounds 异常,尽管我查看了应该包含结果的 userTextArrayList.get(0);。我添加了Log.i 行来检查代码是否成功运行,并且我可以在 Logcat 中看到正在从数据库中提取数据。由于某种原因,此代码没有将结果添加到 ArrayList。

我不确定还可以尝试什么,而且我无法在文档中找到任何可以帮助我解决可能出错的地方。

如果提供答案太麻烦,请随时向我指出可以帮助解决问题的文档。我感谢任何人可以提供的任何指导。

谢谢!

编辑:以下代码行出现错误:

  1. userIdArrayList.add(document.get("UserId").toString());
  2. userTextArrayList.add(document.get("userText").toString())

由于某种原因,这些行没有将数据添加到数组中,当我稍后尝试在代码中打印数组时(即Log.i(TAG, "User Text =&gt; userTextArrayList.get(0).toString());),我收到了IndexOutOfBounds 的错误信息 - 显然 ArrayList 确实尽管上述代码将数据添加到 ArrayLists,但不包含数据。

【问题讨论】:

  • 请说明您在哪一行得到错误。
  • 道歉。我现在将编辑问题。

标签: java android firebase google-cloud-firestore


【解决方案1】:

您需要了解此查询是异步的,执行此日志语句Log.i(TAG, "User Text =&gt; userTextArrayList.get(0).toString());时,结果可能尚未添加到userTextArrayList

此日志语句需要位于onComplete() 中,如下所示:

@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
    if (task.isSuccessful()) {
        for (QueryDocumentSnapshot document : task.getResult()) {
            Log.i(TAG, "onComplete: " + document.get("UserId") + " => " + document.get("userText"));            
            userIdArrayList.add(document.get("UserId").toString());      
            userTextArrayList.add(document.get("userText").toString());
        }
        yourButton.setEnabled(true);
    } else {
        Log.i(TAG, "onComplete: Error getting documents", task.getException());
        yourButton.setEnabled(false);
    }
 }

【讨论】:

  • 我已将此查询放在一个函数中,该函数在 android 活动的 onCreate() 方法的开头调用。 Log.i 代码在用户按下按钮时使用,因此调用的时间比调用查询时要晚得多,因此我希望填充 ArrayLists。从您上面的解决方案来看,您似乎暗示我应该在查询 onComplete 中添加一个“点击监听器”按钮。我不认为上述是正确的解决方案 - 抱歉,但感谢您的帮助。
  • 您可以做的是将您的按钮初始化为禁用,并仅在您的 ArrayList 使用数据更新时启用它(请参阅更新的答案)。考虑到共享的代码很少,这是唯一可以建议的解决方案。希望对您有所帮助!
  • onComplete() 方法不会让它变得无关紧要吗?当然onComplete() 方法只在查询完成后运行?如果我不正确,请告诉我。
  • “onComplete() 方法不会让它变得无关紧要吗?” > 让什么无关紧要?
  • "onComplete() 方法肯定只在查询完成后运行?"是的,但您不知道用户是在调用 onComplete() 之前还是之后按下按钮。这就是为什么我建议在调用 onComplete() 之前禁用你的按钮。
猜你喜欢
  • 1970-01-01
  • 2019-04-22
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-28
  • 2023-03-07
  • 2020-08-28
  • 2021-06-19
相关资源
最近更新 更多