Firestore Query повторяется несколько раз - PullRequest
1 голос
/ 13 апреля 2020

Когда я запрашиваю один документ Ссылка из коллекции повторяется несколько раз. То есть, когда я начинаю запрашивать пример документа, например, имя моей подгруппы, например: "Напитки", я получаю правильные детали документа запроса, Но когда моя подпрограмма -коллекция меняет имя, например: "Фрукты" я получаю результат, но мой запрос повторяется несколько раз. я не знаю, почему из-за общего предпочтения (использовал предпочтение для отправки выбранного идентификатора коллекции из основного занятия в это) или из-за чего-то другого, не смог найти нужную помощь, спасибо.

Мой код:

private void GettingQuantity() {

    Log.d(TAG, "GettingQuantity: Bstarted");

    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String MainCatId = preferences.getString("Main_Id",null);
    String MainCatTittle = preferences.getString("Main_tittle",null);
    String SubCatId = preferences.getString("Sub_Main_Id",null);
    String SubCatTittle = preferences.getString("Sub_Main_tittle",null);
    final String item_id = preferences.getString("ItemID",null);
    final int oldValue = preferences.getInt("OldValue",0);
    final int newValue = preferences.getInt("NewValue",0);



    //sharing to seperate cart node in store
    FirebaseFirestore dQ = FirebaseFirestore.getInstance();
    DocumentReference ProductRef = dQ.collection("HomeFeed")
            .document("5HEkE0ac7sMa7Gjnvf3E")
            .collection("MainCategory")
            .document(MainCatId)
            .collection(MainCatTittle)
            .document(SubCatId)
            .collection(SubCatTittle)
            .document(item_id);

    ProductRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
            Attachment attachment = documentSnapshot.toObject(Attachment.class);
            Log.d(TAG, "onEvent: Bstarted");

            if (newValue == 1 && oldValue == 0) {

                FirebaseFirestore db = FirebaseFirestore.getInstance();
                CollectionReference CartRef = db.collection("Cart");
                Attachment cartItem = new Attachment();

                String cart_id;
                cart_id = item_id;
                cartItem.setItem_id(cart_id);
                cartItem.setItem_brand(attachment.getItem_brand());
                cartItem.setItem_name(attachment.getItem_name());
                cartItem.setItem_price(attachment.getItem_price());
                cartItem.setQuantity(attachment.getQuantity());
                cartItem.setItem_discount(attachment.getItem_discount());
                cartItem.setItem_quantity(newValue);
                cartItem.setUrls(attachment.getUrls());
                Log.d(TAG, "passData: the cart Id: " + cart_id);

                    CartRef.document(cart_id).set(cartItem).addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                        public void onSuccess(Void aVoid) {
                            Toast.makeText(mContext, "Added to cart", Toast.LENGTH_SHORT).show();
                        }
                    })

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

Первый журнал, результаты которого были ожидаемыми

 { 2020-04-13 23:40:08.039 17940-17940/com.example.myconsumer D/ProductItemsActivity: onReceive: Bstarted

  2020-04-13 23:40:08.039 17940-17940/com.example.myconsumer D/ProductItemsActivity: GettingQuantity: Bstarted

  2020-04-13 23:40:08.063 17940-17940/com.example.myconsumer D/ProductItemsActivity: onEvent: Bstarted }

Второй журнал где зациклен несколько раз

{  2020-04-13 23:40:55.062 17940-17940/com.example.myconsumer D/ProductItemsActivity: onReceive: Bstarted

  2020-04-13 23:40:55.062 17940-17940/com.example.myconsumer D/ProductItemsActivity: GettingQuantity: Bstarted

  2020-04-13 23:40:55.064 17940-17940/com.example.myconsumer D/ProductItemsActivity: onReceive: Bstarted

  2020-04-13 23:40:55.064 17940-17940/com.example.myconsumer D/ProductItemsActivity: GettingQuantity: Bstarted

  2020-04-13 23:40:55.076 17940-17940/com.example.myconsumer D/ProductItemsActivity: onEvent: Bstarted

  2020-04-13 23:40:55.083 17940-17940/com.example.myconsumer D/ProductItemsActivity: onEvent: Bstarted }

1 Ответ

1 голос
/ 13 апреля 2020

Но когда мое имя подколлекции меняется, например: "Фрукты", я получаю результат, но мой запрос повторяется несколько раз

Я думаю, что это правильное поведение для базы огня база данных в реальном времени. Всякий раз, когда вы обновляете элемент в базе данных firebase, вызывается прослушиватель изменений для извлечения обновленных данных из вашей базы данных для заполнения в вашем клиенте android.

Следовательно, если вы не хотите, чтобы самое последнее обновление было загружено снова, вы можете отсоединить слушателя , как указано в do c здесь .

// Assign the listener to a variable first
ListenerRegistration registration = ProductRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    // ... Your onEvent code
}

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

registration.remove();

Следовательно, когда загрузка закончится, вы можете вызвать remove на вашем слушателе, чтобы вы прекратили прослушивать изменения базы данных firebase.

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