Что означает ошибка foreach, не применимая к типу для типа DocumentSnapshot? - PullRequest
0 голосов
/ 02 июля 2019

Я следую этому учебнику, чтобы заполнить список из массива в firestore.Однако я получаю сообщение об ошибке, что foreach не применимо к типу «DataSnapshot»

Я точно следовал руководству и не уверен, что может вызвать эту ошибку.

Вот что у меня есть:

private void readData(final MyCallback callback){
        docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
            @Override
            public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                if (task.isSuccessful()) {
                    for (DocumentSnapshot document : task.getResult()){
                        String group = document.getString("following");
                        followingList.add(group);
                    }
                    callback.onCallback(followingList);
                } else {
                }
            }
        });
    }

 private interface MyCallback {
     void onCallback(List<String> list);
 }

Я должен быть в состоянии заполнить список с помощью этого метода, но он не компилируется с ошибкой:

error: for-each not applicable to expression type
required: array or java.lang.Iterable
found:    DocumentSnapshot

Ответы [ 3 ]

1 голос
/ 02 июля 2019

task.getResult() собирается вернуть объект типа DocumentSnapshot, у которого нет метода foreach, соответствующего интерфейсу Iterable.Если вы собираетесь получить только один документ, не будет нескольких документов для повторения.Просто удалите цикл for и получите доступ к полям документа напрямую:

DocumentSnapshot document = task.getResult();
String group = document.getString("following");
followingList.add(group);

У вас будут документы для перебора только в том случае, если вы выполняете запрос, который может вернуть несколько документов, чего вы здесь не делаете.get() возвращает только один документ.

1 голос
/ 02 июля 2019

Согласно https://firebase.google.com/docs/firestore/query-data/get-data, вы можете использовать QuerySnapshot

db.collection("cities")
    .whereEqualTo("capital", true)
    .get()
    .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot document : task.getResult()) {   // LOOP
                    Log.d(TAG, document.getId() + " => " + document.getData());
                }
            } else {
                Log.d(TAG, "Error getting documents: ", task.getException());
            }
        }
    });
0 голосов
/ 02 июля 2019

Я полагаю, ваша задача не выполнена. В Android Developer Doc он описывает:

Returns  TResult    
Throws IllegalStateException    if the Task is not yet complete

Итак, как вы видели, исключение нельзя использовать для каждого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...