【问题标题】:How to get value of parent node as string?如何将父节点的值作为字符串获取?
【发布时间】:2015-06-05 14:40:57
【问题描述】:

所以在上面的数据结构中,我想得到值Aprilia Caponord 1200(标记在图中)。我有对 Aprilia(根节点)的 Firebase 引用,我可以获得所有键/值对数据。

这是我的代码

@override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChild()) {
    Map<?, ?> value = (Map<?, ?>) child.getValue();
    String bike_price = value.get("price").toString();
    String image_url = value.get("image_url").toString();
    }
}

很明显,我可以获得具有键/值关系的子节点的所有值。但我无法具体获取父节点的名称。那么如何获取String格式的父节点的值呢?

如果我打印child.getValue().toString(),我会得到 JSON 值,但我对解析 JSON 不感兴趣。有什么具体的方法可以获取父节点的值吗?

{Aprilia Caponord 1200={image_url=____________, price=18.35}.. }

【问题讨论】:

    标签: java android firebase firebase-realtime-database


    【解决方案1】:

    您可能正在寻找DataSnapshot 上的getKey() 方法:

        mFirebaseRef = new Firebase("https://yours.firebaseio.com");
        mFirebaseRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot child: dataSnapshot.getChildren()) {
                    Log.i("MainActivity", child.getKey());
                }
            }
    
            @Override
            public void onCancelled(FirebaseError firebaseError) {
                Log.e("MainActivity", "onCancelled", firebaseError.toException());
            }
        });
    

    这里有几点需要注意:

    • 我将您代码中的getChild() 更改为getChildren(),因为我知道没有方法getChild()。
    • 您应该考虑使用addChildEventListener,它会在较低级别的节点上为您提供DataSnapshots
    • 如果您为汽车创建“包装类”,事情会变得容易得多。然后,适用于 Android 的 Firebase SDK 会自动将 JSON 解包到该类的实例中。请参阅我们的 AndroidChat repo 了解这方面的一个很好的例子。

    【讨论】:

      【解决方案2】:

      我遇到了这种情况,解决方法如下:

      final ChildEventListener countsListener = new ChildEventListener() { //for querying how many card created by each user in a specific period
                  @Override
                  public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                      /**
                       * $ROOT/Apirilia/Apirilia_id/CardId/IMG_URL
                       * $ROOT/Apirilia/Apirilia_id/CardId/PRICE
                       *                      ^[key] :[value]
                       */
                      if (dataSnapshot == null) {
                          Logger.e("!!! dataSnapshot is null");
                          return;
                      }
                      String apirilia_id = dataSnapshot.getRef().getParent().getKey();
                      Logger.d("... Apirilia_id:" + apirilia_id);
                  }
      
                  @Override
                  public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      
                  }
      
                  @Override
                  public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
      
                  }
      
                  @Override
                  public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
      
                  }
      
                  @Override
                  public void onCancelled(@NonNull DatabaseError databaseError) {
      
                  }
              };
      

      我很高兴能够伸出援助之手。

      【讨论】:

        【解决方案3】:

        对于那些在 firebaseUi 中寻找密钥的人,这段代码适用于你:-

        firebaseadapterinstance.getRef(position).getKey();

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-02-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多