Счетчик автоматических обновлений для всех предметов из базы Firebase Kotlin Android - PullRequest
0 голосов
/ 21 сентября 2019

У меня есть приложение для викторины, и мне нужно реализовать метод, при котором при добавлении нового вопроса автоматически добавляется и обновляется новое поле в базе данных.Я хотел бы, чтобы он прочитал значение в дБ для него в первый раз, а затем увеличил его на +1 и сохранил в том же поле

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

Спасибо за ваше время и терпение!

МОЙ КОД:

    private fun newQuestionCount() {
        val countRef = FirebaseDatabase.getInstance().getReference("/$sessionId/count")
        val arr = arrayListOf<Int>()

        countRef.addValueEventListener(object: ValueEventListener{
            override fun onDataChange(p0: DataSnapshot) {
                if(p0.exists()){
                    val value = p0.getValue(QuestionCountClass::class.java)

                    if (value != null) {
                        arr.add(value.totalItems)
                    }

                }
            }
            override fun onCancelled(p0: DatabaseError) {

            }
        })

        addOne(arr.first())

    }

    private fun addOne(value: Int) {
        val countRef = FirebaseDatabase.getInstance().getReference("/$sessionId/count")
        val newVal = value + 1

        countRef.setValue(newVal)

    }

class QuestionCountClass( val totalItems: Int) {
    constructor() : this(0)
}

Моя база данных

Сведения о сбое:

2019-09-20 21:06:23.056 19824-19824/com.x.quizapp E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.x.quizapp, PID: 19824
    java.util.NoSuchElementException: List is empty.
        at kotlin.collections.CollectionsKt___CollectionsKt.first(_Collections.kt:196)
        at com.x.quizapp.MainActivity.newQuestionCount(MainActivity.kt:91)
        at com.x.quizapp.MainActivity.newQuestion(MainActivity.kt:56)
        at com.x.quizapp.MainActivity.access$newQuestion(MainActivity.kt:17)
        at com.x.quizapp.MainActivity$onCreate$1.onClick(MainActivity.kt:27)
        at android.view.View.performClick(View.java:6256)
        at android.view.View$PerformClick.run(View.java:24701)
        at android.os.Handler.handleCallback(Handler.java:789)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6541)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)

1 Ответ

0 голосов
/ 26 сентября 2019

После нескольких часов работы я решил вернуться к более ранней версии и начать заново.Видимо, каждый раз я ошибался по поводу одного и того же.В конце концов мне удалось заставить его работать.Я выложу решение, если кому-то еще понадобится.

   private fun newQuestionCount() {
    val countRef = FirebaseDatabase.getInstance().getReference("/$sessionId/count")

    countRef.addListenerForSingleValueEvent(object: ValueEventListener{
        override fun onDataChange(p0: DataSnapshot) {
            if(p0.exists()){
                val value = p0.getValue().toString()
                    addOne(value)
            }
        }
        override fun onCancelled(p0: DatabaseError) {}
    })
}

private fun addOne(value: String) {
    val countRef = FirebaseDatabase.getInstance().getReference("/$sessionId/count")
    val newVal = value.toInt()+1

    countRef.setValue(newVal)

}

Я не понимаю, насколько оно корректное, но оно работает довольно хорошо.

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