Firebase перезаписывает одну проблему документа - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь перезаписать один документ в Kotlin. Для создания документа пользователь дает целевую оценку и оценку («Оценка»: 0), создаваемую автоматически, затем при каждом нажатии на изображение число будет увеличиваться, но проблема в этом; если целевая оценка, например, 10, когда я нажимаю на результат оценки изображения, получается значение 10 (целевая оценка) вместо 1.

Вот мой код. Спасибо!

fun pointClicked(view: View) {

    db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").whereEqualTo("taskDocId", taskDocumentId).addSnapshotListener { snapshot, exception ->
        if (exception != null) {
            Toast.makeText(applicationContext,exception.localizedMessage.toString(),Toast.LENGTH_LONG).show()
        } else {

            if (pointTextView.text.toString().toInt() == targetPointTextView.text.toString().toInt()) {
                println("Task completed")

            } else if (pointTextView.text.toString().toInt() < targetPointTextView.text.toString().toInt()) {

                var increasePoint = pointTextView.text.toString().toInt() + 1

                val setPoint = hashMapOf("point" to increasePoint)

                db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").document(taskDocumentId!!).set(setPoint, SetOptions.merge())
                println("Task is not completed")
            }
        }
    }
}

РЕДАКТИРОВАТЬ: Когда я касаюсь imageView один раз, увеличение точки muss +1, например, значение точки равно 0 («точка»: 0), когда я касаюсь imageView один раз, значение точки должно быть 1 («точка»: 1). Но оно не увеличивается +1, точка увеличивается, пока значение не станет равным значениям targetPoint.

Вот новые коды:

fun pointClicked(view: View) {


    db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").whereEqualTo("taskDocId", taskDocumentId).addSnapshotListener { snapshot, exception ->
        if (exception != null) {
            Toast.makeText(applicationContext,exception.localizedMessage.toString(),Toast.LENGTH_LONG).show()
        } else {
            if (snapshot != null) {
                if (!snapshot.isEmpty) {

                    val documents = snapshot.documents
                    for (document in documents) {
                        val point = document.get("point") as Long
                        val targetPoint = document.get("targetPoint") as Long

                        pointTextView.text = point.toString()
                        targetPointTextView.text = targetPoint.toString()

                        if (pointTextView.text.toString().toInt() == targetPointTextView.text.toString().toInt()) {
                            println("Task completed")

                        } else if (pointTextView.text.toString().toInt() < targetPointTextView.text.toString().toInt()) {

                            var increasePoint = pointTextView.text.toString().toInt() + 1

                            val setPoint = hashMapOf("point" to increasePoint)

                            db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").document(taskDocumentId!!).set(setPoint, SetOptions.merge())
                            println("Task is not completed")
                        }
                    }
                }
            }
        }
    }
}

1 Ответ

1 голос
/ 21 февраля 2020

То, что вы делаете, вызывает al oop (см. Встроенные комментарии):

db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").whereEqualTo("taskDocId", taskDocumentId).addSnapshotListener { snapshot, exception ->

        // 
        // CODE HERE WILL RUN EVERY TIME the "tasks" document is updated
        //

        if (exception != null) {
          // ...
        } else {
            if (snapshot != null) {
                if (!snapshot.isEmpty) {

                    val documents = snapshot.documents
                    for (document in documents) {
                        // ...

                        if (...) {
                            // ...

                        } else if (...) {

                            var increasePoint = pointTextView.text.toString().toInt() + 1

                            val setPoint = hashMapOf("point" to increasePoint)

                            //
                            // THIS CODE UPDATES THE SAME DOCUMENT, CAUSING THE SNAPSHOT LISTENER
                            // TO FIRE AGAIN
                            // 

                            db.collection(auth.currentUser!!.email.toString()).document(documentId!!).collection("tasks").document(taskDocumentId!!).set(setPoint, SetOptions.merge())
                            println("Task is not completed")
                        }
                    }
                }
            }
        }
    }

Вы обновляете документ в своем собственном слушателе изменений. Это заставляет слушателя изменения снова срабатывать, вызывая другое обновление. Это повторяется до тех пор, пока вы не достигнете предельного условия, в данном случае счет = 10.

Не совсем понятно, почему вы это сделали, но я бы посоветовал разделить слушателя и часть обновления кода для оценки.

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