Как прослушивать несколько узлов базы данных Firebase Realtime одновременно и в режиме реального времени?

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

база данных:

{
"myGroups" : {
    "userA" : {
      "-GROUPABC" : true,
      "-GROUPCDE" : true,
      "-GROUPFGH" : true
    },
    "userB" : {
      "-GROUPABC" : true
    }
  },
  "readMessagensGroups" : {
    "-GROUPABC" : {
      "-MSG1" : {
        "userA" : true,
        "userB" : true
      },
      "-MSG2" : {
        "userA" : true
      }
    },
    "-GROUPCDE" : {
        "-MSG1" : {
          "userA" : true,
          "userB" : true
        },
        "-MSG2" : {
          "userA" : true
        }
      }
  }
}

person Vitor Ferreira    schedule 15.04.2021    source источник


Ответы (1)


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

object : ValueEventListener {
    override fun onDataChange(dataSnapshot: DataSnapshot) {
        val reads = dataSnapshot.getValue<Map<String, Boolean>>()
        var hasUnread = reads.values().firstOrNull { it.not }  ?: false
        //update ui
    }

    override fun onCancelled...

Таким образом, ваш dataSnapshot — это карта, где ключ — это идентификатор чата, а значение — прочитал ли он или нет. В картах Kotlin вы можете получить значения, а затем найти, соответствует ли какое-либо условие is true, в данном случае просто it.not, потому что это логическое значение. Если есть false, то у вас есть как минимум 1 непрочитанное.

Я предполагаю, что правильная ссылка myGroups/{uid}/{chatId}.

person cutiko    schedule 15.04.2021