Невозможно получить какие-либо значения, используя равный запрос Firebase () - PullRequest
1 голос
/ 12 февраля 2020

Я создаю приложение для чата, и вот как выглядит моя База данных: Please, click here to see

Итак, в настоящее время у меня есть узел users и узел chats.

Узел users сохраняет последнюю дату последнего входа в систему и идентификаторы чатов , частью которых в данный момент является пользователь. В узле chats сохраняются идентификаторы пользователя , которые составляют часть диалога, а также сообщения , которые имеют Id , Содержимое , Дата отправки и Пользователь, отправивший .

В настоящее время я строю действие, в котором отображаются разговоры, частью которых является пользователь ( используя просмотрщик).

Чтобы узнать, в какие разговоры входит пользователь, вместо извлечения всех разговоров я извлекаю идентификаторы чатов , которые находятся в узле user, и Я поместил их все в ArrayList<String>.

Here is a picture that helps you see what goes in the ArrayList

Код, который извлекает эти идентификаторы и помещает их в ArrayList, таков:

        db.addListenerForSingleValueEvent(object : ValueEventListener{
            override fun onCancelled(p0: DatabaseError) {
                TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
            }

            override fun onDataChange(p0: DataSnapshot) {
                p0.children.forEach{
                    chatsId.add(it.key.toString()) // ChatsId is the ArrayList<String>
                }
                getChats2()
            }

        })

И этот код работает как шарм. Проблема возникает, когда я пытаюсь выполнить запрос к узлу chats просто для того, чтобы получить чат, значение которого равно значениям, полученным в приведенном выше коде. ** Этот код реализован в getsChat2 () **:

 db = FirebaseDatabase.getInstance().getReference("chats")

        // For each chatId, queries the DB to find the chat reference
        chatsId.forEach {
            val query = db.equalTo(it)
            query.addValueEventListener(object : ValueEventListener{
                override fun onCancelled(p0: DatabaseError) {
                    TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
                }

                override fun onDataChange(p0: DataSnapshot) {
                    p0.children.forEach {it2->
                        println("Do something")
                        // Do something with the chat reference
                    }
                }

            })
        }

Проблема в том, что даже если существует узел с тем же значением, что и переменная chatsId, println("Do Something) на самом деле никогда не будет печать.

1 Ответ

2 голосов
/ 12 февраля 2020

Немного трудно понять, что вы пытаетесь сделать, но мое образованное предположение состоит в том, что вы пропускаете orderByKey() звонок:

val query = db.orderByKey().equalTo(it)

Когда вы не звоните никому orderBy...() метод, узлы сортируются по приоритету. Это пережиток ранних дней API, который практически не использовался, поэтому в наши дни это в основном означает, что вы должны вызывать orderBy...() перед фильтрацией.

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