我可以订购 firebase addValueEventListeners 以便它们按特定顺序执行吗?
Can I order firebase addValueEventListeners so that they execute in a specific order?
您好,我正在 Java 的 Android Studio 中开发一个聊天应用程序,并尝试从 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 个侦听器,所以我不确定如何让它们按顺序工作。任何指导将不胜感激,谢谢
.addValueEventListener()
当数据库更新时,它会触发此函数 运行 。假设您在设备上有一份 Firebase 数据的副本
并且一切都正确同步然后什么都没有发生(你不使用互联网连接来获取数据你只是问数据库是否做了任何修改或没有),现在你从你的数据库获得的所有数据都来自你的本地数据库版本火力地堡数据库。
这只是关于 firebase 如何系统地工作的详细信息。
如果插入数据,您将获得仅发生的修改 + 在您的“本地 Firebase 数据库”中未更改的数据。
因此,现在您需要在“远程 Firebase 数据库”上发生修改时,通过 清除 和 重新填充 将数据存储在列表中。
然后处理您设备上的列表。
您好,我正在 Java 的 Android Studio 中开发一个聊天应用程序,并尝试从 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 个侦听器,所以我不确定如何让它们按顺序工作。任何指导将不胜感激,谢谢
.addValueEventListener()
当数据库更新时,它会触发此函数 运行 。假设您在设备上有一份 Firebase 数据的副本
并且一切都正确同步然后什么都没有发生(你不使用互联网连接来获取数据你只是问数据库是否做了任何修改或没有),现在你从你的数据库获得的所有数据都来自你的本地数据库版本火力地堡数据库。
这只是关于 firebase 如何系统地工作的详细信息。
如果插入数据,您将获得仅发生的修改 + 在您的“本地 Firebase 数据库”中未更改的数据。
因此,现在您需要在“远程 Firebase 数据库”上发生修改时,通过 清除 和 重新填充 将数据存储在列表中。
然后处理您设备上的列表。