如何准确地使用'addChildEventListener()'以达到以下目的?

时间:2017-02-25 19:44:35

标签: android firebase firebase-realtime-database

我有一些数据存储在FirebaseDatabase

这是数据结构的样子:

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

以下是我尝试使用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 {
              }
    }
    ...
    ...
});

这里的Log.d正在打印出来:

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

我试过了Log.d("dataSnapshot", dataSnapshot.getKey());,但后来我得到了:

D/dataSnapshot: key
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");

我知道我可以使用addListenerForSingleValueEventaddValueEventListener来实现我想要的但我不希望每次调用onDataChange()时都会运行这段代码而且我只能通过在onChildAdded()中添加代码来实现(或不是?)。

那么,我怎么能在这里使用addChildEventListener()来获得所需的结果呢?

1 个答案:

答案 0 :(得分:1)

如果您想要{key=value, key=value, key=value}这样的数据,则.child(requestID)只有.child(key) .addValueEventListener ((HashMap) dataSnapshot.getValue())。它返回整个节点。然后将其转换为散列图((HashMap) dataSnapshot.getValue()).get(key)。使用Hashmap获取特定值。

但您希望使用addChildEventListener()创建Hashmap。在addChildEventListener()之前创建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 { } } ... ... });

<string name="key"><![CDATA[Hey I'm a tag with & and other characters]]></string>