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

时间:2016-07-07 21:23:04

标签: android firebase firebase-realtime-database

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

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

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

DatabaseReference root_firebase = FirebaseDatabase.getInstance().getReference();
DatabaseReference users_firebase = root_firebase.child("Users");
DatabaseReference friend_found = users_firebase.child(key_searched_friend);

一旦我拥有它,我会尝试调用某种方法,如

friend_found.getValue(); 

friend_found.child("user_name").getValue();

但它不存在,

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

friend_found.getKey();
friend_found.child("user_name").getKey();

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

这是我的firebase数据库结构:

{
  "RoomNames" : {
    "Room-KM5cof0jcoMN8a4g6vC" : {
      "room_name" : "TESTrOOM"
    },
    "Room-KM5dg_WPRdEOT4_oJ1r" : {
      "room_name" : "testRoom2"
    }
  },
  "Users" : {
    "User-KM5ZaGq0xvjQis05CPF" : {
      "user_name" : "Enrique"
    }
  }
}

3 个答案:

答案 0 :(得分:5)

你说:我无法通过覆盖方法onDataChanged()执行此操作,因为当我查询此值时数据不会更改

Retrieve Data的指南解释了:

  

通过将异步侦听器附加到a来检索Firebase数据   FirebaseDatabase引用。听众被触发一次   数据的初始状态,并且在数据发生变化的任何时候都会再次出现。

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

在标题为“一次读取数据”的部分中,指南指出:

  

在某些情况下,您可能希望一次调用回调   立即删除,例如初始化你的UI元素时   不要期待改变。你可以使用    addListenerForSingleValueEvent()方法简化了这种情况:它   触发一次然后不再触发。

答案 1 :(得分:0)

用法如下:

friend_found.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                 String value = dataSnapshot.getValue(String.class);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.e(TAG,"Error while reading data");
            }
        });

答案 2 :(得分:0)

对于数据库引用对象,与添加事件侦听器的方式相同,也可以使用removeEventListener将其删除。

而不是像这样创建一个匿名对象

    friend_found.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    String value = dataSnapshot.getValue(String.class);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.e(TAG,"Error while reading data");
            }
    });

您可以创建 ValueEventListener 的命名对象,并在 removeEventListener 方法的末尾使用 onDataChange 将其从数据库引用对象中删除

    ValueEventListener valueEventListener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                    String value = dataSnapshot.getValue(String.class);

                    friend_found.removeEventListener(valueEventListener);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                    Log.e(TAG,"Error while reading data");
            }
    });

    friend_found.addValueEventListener(valueEventListener);

onDataChange 方法中的代码只执行一次,因为 ValueEventListener 对象在该方法的最后一行执行后立即被删除。