我有一些数据存储在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");
我知道我可以使用addListenerForSingleValueEvent
或addValueEventListener
来实现我想要的但我不希望每次调用onDataChange()
时都会运行这段代码而且我只能通过在onChildAdded()
中添加代码来实现(或不是?)。
那么,我怎么能在这里使用addChildEventListener()
来获得所需的结果呢?
答案 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>