Kotlin 如何从循环中的Firestore查询中获取单个文档

Kotlin 如何从循环中的Firestore查询中获取单个文档,kotlin,google-cloud-firestore,android-notifications,Kotlin,Google Cloud Firestore,Android Notifications,在我的应用程序中,我正在Firestore查询中运行for循环。此查询本身仅用于返回满足品牌和位置条件(字符串值)且文档中的计数器(“交易编号”)大于用户集合中的比较计数器(登录.交易编号)的文档 因此,本质上,我在用户集合中搜索最后一个计数器编号,并将其用作对交易id中计数器的逻辑检查 menuref = FirebaseFirestore.getInstance() menuref.collection("Users").whereEqualTo("uid", userid)

在我的应用程序中,我正在Firestore查询中运行
for
循环。此查询本身仅用于返回满足品牌和位置条件(字符串值)且文档中的计数器(
“交易编号”
)大于用户集合中的比较计数器(
登录.交易编号
)的文档

因此,本质上,我在用户集合中搜索最后一个计数器编号,并将其用作对交易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


                            }


                        }

                    }
            }
        }
menuref=FirebaseFirestore.getInstance()
menuref.collection(“用户”)。其中equalto(“uid”,userid)
.addSnapshotListener{值,任务->
如果(任务!=null){
return@addSnapshotListener
}
for(文档的值!!){
val卖方品牌=document.getString(“品牌”)!!
val seller_location=document.getString(“位置”)!!
val-deal\u-num=document.getLong(“上次交易数量”)!!
//Login.deal_number是一个伴随对象
Login.deal\u number=deal\u num
日志d(“Firestore品牌”,卖家品牌)
日志d(“Firestore\u位置”,卖方位置)
Log.d(“lastdealnum”,“${Login.deal\u number}”)
收藏菜单(“汽车交易”)。whereEqualTo(“品牌”,卖家品牌)。whereEqualTo(卖家位置,“真实”)。Wheregreater(“交易编号”,登录。交易编号)
.addSnapshotListener{值,任务->
如果(任务!=null){
return@addSnapshotListener
}
柜台交易=0
for(文档的值!!){
val new_deal_num=document.getLong(“交易编号”)!!
Log.d(“dealnumnew”,“$new\u deal\u num”)
if(new_deal_num==Login.deal_number){
柜台交易=柜台交易+1
打破
}else if(new_deal_numLogin.deal_number&&counter_deal<1){
Log.d(“Tag_counter_deal”,“${counter_deal}”)
Log.d(“Tag_newdeal_num”,“${newdeal_num}”)
Log.d(“Tag_userdeal_num”,“${Login.deal_number}”)
柜台交易=柜台交易+1
newdealnumref=
FirebaseFirestore.getInstance()集合(“用户”)
newdealnumref.document(用户ID)
.更新(“上次交易数量”,新交易数量)
.addOnSuccessListener{
}.addOnFailureListener{e->
Log.w(
“firestore\u创建\u错误”,
“写入文档时出错”,
E
)
}
Log.d(“newdealbrand”,“卖方品牌$卖方位置”)
日志d(“新政”,“新政发现”)
dealCreatedNotificationChannel()//这是android O通道的创建
CodeTorUnformNotification()//这是为通知运行的代码。一般,未根据正常的通知创建更改任何内容
与(来自(此)的NotificationManagerCompat{
通知(通知建筑商的计数器)
通知柜台++
}
柜台交易=0
打破
}
}
}
}
}
对于以上内容,为什么Firestore在应该只有一个事件的情况下创建多个通知,这是因为过滤器似乎没有正确应用。这是因为与使用recyclerview/listview时的效果相同,因此需要清除数组以防止满足条件的重复

这似乎是基于Firestore查询运行通知的常见趋势。这可能吗?我在for循环中尝试了各种中断,但在同一个文档中不断得到多个点击。我尝试使用
计数器\u deal
来限制快照触发后发送的通知量


请将您的数据库结构添加为屏幕截图。@AlexMamo,数据库图像added@AlexMamo,因为上面是一个查询中的查询,所以文档是否有值是一个问题!!在两种情况下都声明?我应该在“子”查询中重命名文档吗?我相信我以前测试过这个,但会再试一次。确定