В моем приложении я запускаю for
l oop в моем запросе Firestore. сам этот запрос предназначен только для возврата документов, в которых соблюдаются критерии марки и местоположения (строковые значения) И где счетчик ("deal_number"
), расположенный в документе,> сравнительный счетчик в коллекциях пользователей (Login.deal_number
).
По сути, я ищу в коллекции пользователей последний номер счетчика и использую его в качестве логической проверки счетчика в идентификаторе сделки
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 создает несколько уведомлений, когда должно быть только одно событие, это из-за того, что фильтр, кажется, не применяется правильно. Это происходит из-за того же эффекта, который вы имели бы в режиме повторного просмотра / просмотра списков, при котором вам нужно очистить массив, не допуская дубликатов, которые соответствуют критериям?
Кажется, что это обычная тенденция с запуском уведомления на основе запрос Firestore. Это вообще возможно? Я пробовал все виды перерывов в течение l oop, но продолжаю получать несколько обращений к одному и тому же документу. Я пытался использовать counter_deal
, чтобы ограничить количество уведомлений, отправляемых после того, как снимок был сделан без удачи.
![Database 1](https://i.stack.imgur.com/NsSsq.png)