如何准确地使用'addChildEventListener()'来达到以下目的? [英] How can I use 'addChildEventListener()' accurately for following purpose?

查看:158
本文介绍了如何准确地使用'addChildEventListener()'来达到以下目的?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一些数据存储在 FirebaseDatabase 中。



数据结构如下所示:

  app 
-ref
-requestID
-key
-key:value
-key:value
-key:value

以下是我试图检索数据使用 addChildEventListener()
$ b

  ref = FirebaseDatabase.getInstance ).getReferenceFromUrl( https://app-q24sg.firebaseio.com/ref); 
$ b $ ref.child(requestID).child(key).addChildEventListener(new ChildEventListener(){
@Override
public void onChildAdded(DataSnapshot dataSnapshot,String s){
if(dataSnapshot.getValue()!= null){

Log.d(dataSnapshot,dataSnapshot.getValue()。toString());
} else {
}
}
...
...
});

Log.d :

$ $ $ $ $ c $ D $ data $快速
$ D / dataSnapshot
D $ data $快速

我试过 Log.d(dataSnapshot,dataSnapshot.getKey()); 但是我得到了:
$ b $ pre $ D $ data $快照键
D / dataSnapshot:key
D / dataSnapshot:key

我想要的是:

  {key = value,key = value,key = value} 

以便我可以做到这一点:

  final Map< String,String> map =(Map< String,String>)dataSnapshot.getValue(); 
key1 = map.get(key);
key2 = map.get(key);

我知道我可以使用 addListenerForSingleValueEvent addValueEventListener 来实现我想要的,但是我不想每次运行 onDataChange()时都要运行这段代码而且我只能通过在 onChildAdded()(或不是?)中添加代码来达到目的。

那么,我该如何使用 addChildEventListener()来获得所需的结果呢?

解决方案

如果你想得到像 {key = value,key = value,key = value} 这样的数据,只能得到。 child(requestID)没有 .child(key) with .addValueEventListener 。它返回整个节点。然后将其转换为散列图,((HashMap)dataSnapshot.getValue())。通过((HashMap)dataSnapshot.getValue())。get(key)获取具体值。



但是你想用 addChildEventListener()来创建 Hashmap 。在 addChildEventListener()之前创建一个 Hashmap ,然后在 onChildAdded

  final HashMap< String,Object> map = new HashMap<>(); 
ref.child(requestID).addChildEventListener(new ChildEventListener(){
@Override $ b $ public void onChildAdded(DataSnapshot dataSnapshot,String s){$ b $ if(dataSnapshot.getValue() != null){

map.put(dataSnapshot.getKey(),dataSnapshot.getValue());
} else {
}
}
...
...
});


I have some data stored in FirebaseDatabase.

Here's what data-structure look like:

app
 -ref
   -requestID
     -key
       -key: value
       -key: value
       -key: value

Here's how I'm trying to retrieve data using addChildEventListener():

    ref = FirebaseDatabase.getInstance().getReferenceFromUrl("https://app-q24sg.firebaseio.com/ref");

    ref.child(requestID).child(key).addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(DataSnapshot dataSnapshot, String s) {
              if (dataSnapshot.getValue() != null) {

                  Log.d("dataSnapshot", dataSnapshot.getValue().toString());
              } else {
              }
    }
    ...
    ...
});

The Log.d here is printing out:

D/dataSnapshot: value
D/dataSnapshot: value
D/dataSnapshot: value

I tried Log.d("dataSnapshot", dataSnapshot.getKey()); but then I got:

D/dataSnapshot: key
D/dataSnapshot: key
D/dataSnapshot: key

What I want is:

{key=value, key=value, key=value}

so that I can do this:

final Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
key1 = map.get("key");
key2 = map.get("key");

I know I can use addListenerForSingleValueEvent or addValueEventListener for achieving what I want but I don't want the piece of code to run every time onDataChange() is called and that I can only achieve by adding code in onChildAdded() (or not?).

So, how can I use addChildEventListener() here to get the required results?

解决方案

If you want the datas like {key=value, key=value, key=value}, get only .child(requestID) without .child(key) with .addValueEventListener. It returns whole node. Then cast it to a hashmap, ((HashMap) dataSnapshot.getValue()). Get the specific value with ((HashMap) dataSnapshot.getValue()).get(key).

But you want create Hashmap with addChildEventListener(). Create a Hashmap before the addChildEventListener() then fill it in onChildAdded,

final HashMap<String, Object> map = new HashMap<>();
ref.child(requestID).addChildEventListener(new ChildEventListener() {
          @Override
          public void onChildAdded(DataSnapshot dataSnapshot, String s) {
              if (dataSnapshot.getValue() != null) {

                      map.put(dataSnapshot.getKey(),dataSnapshot.getValue());
              } else {
              }
    }
    ...
    ...
});

这篇关于如何准确地使用'addChildEventListener()'来达到以下目的?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆