首页 > 解决方案 > Firebase Cloud Firestore:查询未更新 Android 中的 ArrayList

问题描述

我正在使用以下查询:

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 => userTextArrayList.get(0).toString());),我收到并出错IndexOutOfBounds- 尽管上面的代码添加了数据,但 ArrayList 显然不包含数据到 ArrayLists。

标签: javaandroidfirebasegoogle-cloud-firestore

解决方案


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

此日志语句需要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);
    }
 }

推荐阅读