【发布时间】:2022-01-18 23:12:22
【问题描述】:
您好,我正在 Android Studio 上使用 Java 开发聊天应用程序,并尝试从结构类似的 firebase 实时数据库中读取数据
{
"Chats":{
"<chatID>":{
"<title>",
"<lastmessage>"
"<timestamp>"
"Users":{
"<user1ID>",
"<user2ID>"
}
}
},
"Users":{
"<userID>":{
"<name>",
"<email>",
"Contacts":{
"<contactID>",
},
"Chats":{
"<chatID>"
}
}
}
}
目前我有 3 个独立的事件监听器,它们将读取的数据添加到二维数组中
ArrayList<ArrayList<String>> chatsDetails; //[("chatID","timestamp",userUID","userName","userEmail"),...]
代码很长,但事件侦听器的标题(重现问题所需的最短代码)是这样的
/*Listener 1- populate ArrayList with chat ID from Firebase database*/
databaseReference.child("users").child(mAuth.getCurrentUser().getUid()).child("chats").addValueEventListener(new ValueEventListener() {
});
/*Listener 2- populate 2d ArrayList with users uid and timestamp from Firebase database*/
databaseReference.child("chats").addValueEventListener(new ValueEventListener() {
//requires the chat id from listener 1
});
/*Listener 2- whenever values under users changes, update user email and name in 2D array*/
databaseReference.child("users").addValueEventListener(new ValueEventListener() {
//requires the user uid from listener 2
});
具体问题: 问题是当我对控制台执行 Logd 时,我意识到侦听器没有按照我要求的顺序运行。这会导致用户的姓名和电子邮件未被检索并存储到 ArrayList 中。
期望的行为: 我想知道是否有任何方法可以使事件监听器一个接一个地运行(因此日志控制台应该显示按该顺序执行的监听器 1、2、3
我试图寻找OnCompleteListeners,但找不到任何相关信息,我尝试嵌套addValueEventListeners,但没有成功。问题是当一个新的被添加到数据库中时,它会同时触发所有 3 个监听器,所以我不确定如何让它们按顺序工作。任何指导将不胜感激,谢谢
【问题讨论】:
-
您必须将
chats放在users中。 -
我想你很可能会在这篇文章中找到答案,How to read data from Firebase Realtime Database using get()?
-
@TicherhazFreePalestine 我试图避免嵌套数据以按照此处的示例来平整我的数据库firebase.google.com/docs/database/android/structure-data
-
@AlexMamo 谢谢我会读一读,但我不确定 get() 是否会工作,因为我不想只读取一次数据,即我想收听更新.该程序在仅触发一个侦听器时起作用,只是当所有 3 个侦听器都被触发时,我无法控制它们进入的顺序
标签: java android firebase firebase-realtime-database