首页 > 解决方案 > 如何在循环中从 Firestore 查询中获取单个文档

问题描述

在我的应用程序for中,我在 Firestore 查询中运行一个循环。此查询本身旨在仅返回满足品牌和位置标准(字符串值)并且"deal_number"位于文档中的计数器()大于用户集合中的比较计数器()的文档Login.deal_number

所以本质上,我在用户集合中搜索最后一个计数器编号,并将其用作对交易 ID 中的计数器的逻辑检查

 menuref = FirebaseFirestore.getInstance()

    menuref.collection("Users").whereEqualTo("uid", userid)
        .addSnapshotListener { value, task ->

            if (task != null) {

                return@addSnapshotListener
            }

            for (document in value!!) {

                val seller_brand = document.getString("brand")!!
                val seller_location = document.getString("location")!!
                val deal_num = document.getLong("last_deal_num")!!

//Login.deal_number is a companion object

                Login.deal_number = deal_num



                Log.d("Firestore_brand", seller_brand)
                Log.d("Firestore_location", seller_location)
                Log.d("lastdealnum", "${Login.deal_number}")

                menuref.collection("Car_Deals").whereEqualTo("brand", seller_brand).whereEqualTo(seller_location, "True").whereGreaterThan("deal_number",Login.deal_number)
                    .addSnapshotListener { value, task ->

                        if (task != null) {

                            return@addSnapshotListener
                        }

                        counter_deal = 0

                        for (document in value!!) {

                            val new_deal_num = document.getLong("deal_number")!!
                            Log.d("dealnumnew", "$new_deal_num")

                            if (new_deal_num == Login.deal_number) {

                                counter_deal = counter_deal + 1
                                break
                            } else if (new_deal_num < Login.deal_number) {

                                counter_deal = counter_deal + 1
                                break

                            }
                            else if (new_deal_num > Login.deal_number && counter_deal < 1) {

                                Log.d("Tag_counter_deal","${counter_deal}")
                                Log.d("Tag_newdeal_num","${new_deal_num}")
                                Log.d("Tag_userdeal_num","${Login.deal_number}")

                                counter_deal = counter_deal + 1


                                newdealnumref =
                                    FirebaseFirestore.getInstance().collection("Users")

                                newdealnumref.document(userid)
                                    .update("last_deal_num", new_deal_num)
                                    .addOnSuccessListener {

                                    }.addOnFailureListener { e ->

                                        Log.w(
                                            "firestore_create_error",
                                            "Error writing to document",
                                            e
                                        )

                                    }

                                Log.d("newdealbrand", "$seller_brand $seller_location")
                                Log.d("newdeal", "New deal found")

                                dealCreatedNotificationChannel() // this is the android O channel creation

                                CodetoRunforNotification() // this is the code to run for the notification. generic, havent changed anything according to normal notification creation


                                with(NotificationManagerCompat.from(this)) {


                                    notify(notify_counter, builder)
                                    notify_counter++
                                }
                                counter_deal = 0
                                break


                            }


                        }

                    }
            }
        }

对于上述情况,为什么 Firestore 在应该只有一个事件时会创建多个通知,是因为过滤器似乎没有正确应用的方式。是否由于与 recyclerview/listview 相同的效果,您需要清除数组以防止符合标准的重复项?

这似乎是基于 Firestore 查询运行通知的常见趋势。这甚至可能吗?我在 for 循环中尝试了各种中断,但在同一个文档上不断获得多次点击。counter_deal一旦没有运气触发快照,我尝试使用来限制发送的通知数量。

数据库 1

数据库 2

标签: kotlingoogle-cloud-firestoreandroid-notifications

解决方案


推荐阅读