【问题标题】:Can I order firebase addValueEventListeners so that they execute in a specific order? [closed]我可以订购 firebase addValueEventListeners 以便它们按特定顺序执行吗? [关闭]
【发布时间】: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&lt;ArrayList&lt;String&gt;&gt; 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 个监听器,所以我不确定如何让它们按顺序工作。任何指导将不胜感激,谢谢

【问题讨论】:

标签: java android firebase firebase-realtime-database


【解决方案1】:
 .addValueEventListener()

当数据库更新时,它会触发此函数运行。假设您在设备上拥有 Firebase 数据的副本 并且一切都正确同步然后什么都没有发生(你没有使用互联网连接来获取数据你只是询问数据库是否进行了任何修改),现在你从你的数据库获得的所有数据都来自你的本地数据库版本Firebase 数据库。 这只是关于 Firebase 如何系统工作的详细信息。
如果插入了数据,您将获得仅发生的修改+“本地 Firebase db”中未更改的数据。
因此,现在您需要在“远程 Firebase db”上发生修改时通过清除重新填充将数据存储在列表中。
然后处理您设备上的列表。

【讨论】:

  • 所以在 Listener 1 中我清除并重新填充了 2D ArrayList,但是我不确定您是说我应该下载整个数据库的本地副本吗?
  • 你的监听器只能做一个角色:从 firebase 获取你在本地设备上需要的每一个数据,并将其保存到一个 ArrayList 中。
  • 在这些列表中使用 foreach 循环来读取如下数据: (Users user : listOfUsersISavedInTheaddValueEventListener){ DoSomethingWith(user.name,user.email,user.Contacts , user.Chats); }
  • 并且 listOfUsersISavedInTheaddValueEventListener 将由 .addValueEventListener() 永久自动更新
  • 是的,对不起,我忘了说 foreach 循环必须在外面。再次是因为侦听器的工作只是将您的设备与 Firebase“同步”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-08
  • 1970-01-01
  • 1970-01-01
  • 2012-05-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多