【问题标题】:How can I use 'addChildEventListener()' accurately for following purpose?我怎样才能准确地使用“addChildEventListener()”来达到以下目的?
【发布时间】:2017-02-25 19:44:34
【问题描述】:

我有一些数据存储在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() 时都运行这段代码,而我只能通过在@ 中添加代码来实现987654335@(或者不是?)。

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

【问题讨论】:

  • 你什么时候想要这个字符串{key=value, key=value, key=value}?是否适用于每个onChildAdded(因此对于每个onChildAdded 方法调用,返回的字符串都是递增的)?或任何其他事件?请解释一下。
  • @Wilik 是的,在requestID 下添加了一个孩子,所以每个onChildAdded 都需要{key=value, key=value, key=value}
  • 请回复.. 我在这里提出了一个新的相关问题:stackoverflow.com/q/42469250/6144372

标签: android firebase firebase-realtime-database


【解决方案1】:

如果您想要{key=value, key=value, key=value} 之类的数据,请仅获取.child(requestID) 而不使用.child(key).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
          public void onChildAdded(DataSnapshot dataSnapshot, String s) {
              if (dataSnapshot.getValue() != null) {

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

【讨论】:

  • 在这样做之后:map.put(dataSnapshot.getKey(),dataSnapshot.getValue()); 我可以这样做吗:key1 = map.get("key"); key2 = map.get("key");??
  • 不,在map.put(dataSnapshot.getKey(),dataSnapshot.getValue()); 执行此操作后Log.d("key", map.get("key").toString()); 会导致应用程序崩溃nullpointerexception
  • 我看不出你不能这样做的理由。也许你的路径下没有数据,dataSnapshot.getValue() 返回null。而addChildEventListener 是一种异步方法,如果您尝试获取低于addChildEventListener 的map 值,它可以返回null。在确定答案来自火力基地后,尝试从地图中获取数据。 @HammadNasir
  • 好吧,我试过这个:Log.d("map", map.toString()); 并打印了D/key: value,所以我确定它不是null。但是做Log.d("key", map.get("key").toString()); 会返回null
  • 您确定您在地图中输入的密钥与您用来调用的密钥相同吗?你在调试模式下检查了吗? @HammadNasir
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 2017-09-23
  • 2017-08-07
相关资源
最近更新 更多