Firebase Cloud Firestore: запрос не обновляет ArrayList в Android - PullRequest
0 голосов
/ 12 февраля 2020

Я использую следующий запрос:

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 не содержит данных, несмотря на то, что приведенный выше код добавляет данные в ArrayList.

1 Ответ

1 голос
/ 12 февраля 2020

Необходимо понимать, что этот запрос является асинхронным, и результаты, возможно, еще не были добавлены в 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);
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...