Слушайте новые дополнения к документу Cloud Firestore - PullRequest
0 голосов
/ 03 марта 2019

Я создаю приложение, которое будет прослушивать добавление нового документа в коллекцию Firestore.Я попытался просмотреть документацию Firestore, но не работает для моей конкретной проблемы.Вот мой код для прослушивания документа Updata

FirebaseFirestore.getInstance().collection("users/" + companyID + "/trips").addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot querySnapshot, @Nullable FirebaseFirestoreException e) {
            if (e != null) {
                Log.w(TAG, "Listen failed.", e);
                return;
            }
            if (!querySnapshot.isEmpty()){
                for (QueryDocumentSnapshot qds : querySnapshot){
                    tripList.add(qds.getId());
                }
                showTripList();//update trip list view
            }
        }
    });

Показать список в ListView

public void showTripList() {
    ListView tripListView = findViewById(R.id.tripList);

    if (tripList.size() != 0) {
        ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, tripList);
        tripListView.setAdapter(arrayAdapter);//show trip list on screen
    } else {
        TextView noTripTxt = findViewById(R.id.noTripTxt);
        noTripTxt.setVisibility(View.VISIBLE);//show "no trip has been made yet" text to user
    }
}

LogCat показывает NullPointerException в этих двух строках

FirebaseFirestore.getInstance().collection("users/" + companyID + "/trips").addSnapshotListener(new EventListener<QuerySnapshot>()
tripList.add(qds.getId());

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Вот код, который у меня работает

FirebaseFirestore.getInstance().collection("users/" + companyID + "/trips")
                .addSnapshotListener(new EventListener<QuerySnapshot>() {
                    @Override
                    public void onEvent(@Nullable QuerySnapshot value, @Nullable FirebaseFirestoreException e) {
                        if (e != null) {
                            Log.w(TAG, "Listen failed.", e);
                            return;
                        }
                        tripList.clear();//clear the ArrayList, because this method get all the document id instead of
                                        //the one that just created
                        for (QueryDocumentSnapshot doc : value) {
                            if (doc.getId() != null){
                                tripList.add(doc.getId());//store the document IDs to ArrayList

                                Log.d(TAG, "Retrieved data: " + doc.getId());
                            }
                        }
                        showTripList();//show trip name to listView
                    }
                });
0 голосов
/ 03 марта 2019

Код, которым вы поделились, похоже, пытается прослушать субколлекцию trips определенного companyId.Но способ построения пути к этой коллекции кажется подозрительным:

collection("users" + companyID + "trips")

Общий путь должен составлять users/${companyID}/trips, поэтому более вероятно, что код должен быть:

collection("users/" + companyID + "/trips")

Без / ваш код прослушивает коллекцию верхнего уровня users${companyID}trips, которой не существует.Это объясняет, почему вы не получаете никаких результатов.

Обратите внимание, что вы можете легко предотвратить такие проблемы конкатенации строк, используя более явный вариант API:

collection("users").doc(companyID).collection("trips")

Хотя это последнеевариант немного длиннее, он исключает вероятность ошибок при простой конкатенации строк.


После исправления пути сбора ваш код будет прослушивать данные во вложенной коллекции.Таким образом, он будет соответствовать нескольким документам и получит QuerySnapshot, как показано в документации по , прослушиванию нескольких документов в коллекции .

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