如何获取firebase数据库的一次值(Android)

Enr*_*zar 2 android firebase firebase-realtime-database

我刚刚开始使用firebase,我很惊讶复杂的东西是多么简单,以及复杂的简单事物是多么简单.

我需要检查Firebase数据库中是否存在用户,如果存在,我需要获取其密钥和值.

我有密钥,我尝试通过转到我的用户子树并为具有相同密钥(ID)的孩子找到它在DB中找到它

DatabaseReference root_firebase = FirebaseDatabase.getInstance().getReference();
DatabaseReference users_firebase = root_firebase.child("Users");
DatabaseReference friend_found = users_firebase.child(key_searched_friend);
Run Code Online (Sandbox Code Playgroud)

一旦我拥有它,我试着调用一些方法

friend_found.getValue(); 
Run Code Online (Sandbox Code Playgroud)

要么

friend_found.child("user_name").getValue();
Run Code Online (Sandbox Code Playgroud)

但它不存在,

这似乎很奇怪,因为我可以做到这两点

friend_found.getKey();
friend_found.child("user_name").getKey();
Run Code Online (Sandbox Code Playgroud)

我无法使用覆盖方法onDataChanged()来执行此操作,因为在查询此值时数据不会更改.

这是我的firebase数据库结构:

{
  "RoomNames" : {
    "Room-KM5cof0jcoMN8a4g6vC" : {
      "room_name" : "TESTrOOM"
    },
    "Room-KM5dg_WPRdEOT4_oJ1r" : {
      "room_name" : "testRoom2"
    }
  },
  "Users" : {
    "User-KM5ZaGq0xvjQis05CPF" : {
      "user_name" : "Enrique"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Bob*_*der 6

你说:我不能用override方法onDataChanged()来做这个,因为当我查询这个值时数据不会改变

如何检索数据的指南解释了:

通过将异步侦听器附加到FirebaseDatabase引用来检索Firebase数据.对于数据的初始状态,监听器被触发一次,并且在数据改变的任何时候再次触发监听器.

因此,当您将侦听器附加到某个位置时,onDataChanged()会触发并为您提供当前值.

在标题为Read Data Once的部分中,指南指出:

在某些情况下,您可能希望调用一次回调然后立即删除,例如在初始化您不希望更改的UI元素时.您可以使用 addListenerForSingleValueEvent()方法来简化此方案:它会触发一次,然后不会再次触发.