首页 > 解决方案 > android:获取孩子的孩子

问题描述

我正在尝试获取当前位于我的“历史”节点中的骑行的“状态”,但首先我必须获得“rideKey”。

全局变量:字符串rideKey、字符串键。

历史节点:

{
  "History" : {
    "-LGXaukR30LTjrL3ZNpt" : {
      "driver" : "ptnVOKounjXE9VrmZCCvKoZWluf1",
      "rating" : 0,
      "ridePrice" : 5.25,
      "rider" : "C0RjB5NPZcTvWz9XiUAhpTDOK0C2",
      "status" : "accepted",
      "timestamp" : 1530662726
    }
  }
}

为了获得rideKey,我这样做了:

    DatabaseReference keyRef = FirebaseDatabase.getInstance().getReference("History");
    keyRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            rideKey = String.valueOf(mDatabase.child("History").push().getKey());
            Log.d(TAG, "getKey: key = " + rideKey);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

这给了我历史中的所有键,我怎样才能获得最新的?

现在,我还需要获取请求的“状态”。

但是,当我尝试获取状态时,它一直为空。
我尝试将另一个 ValueEventListener 放在rideKey 值事件中,但仍然为空

关于我做错了什么的任何想法? 非常感激。

编辑

Log.e(TAG, "I made it to getKeyAndStatus");

    DatabaseReference keyRef = FirebaseDatabase.getInstance().getReference("History");
    keyRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
**// Log.e(TAG, "I made it to getKeyAndStatus: onDataChange");**

            Iterable<DataSnapshot> children = dataSnapshot.child("History").getChildren();

            for (DataSnapshot child : children){
                Log.d(TAG, "getKey: key = " + child.getKey());

                Ride ride = child.getValue(Ride.class);
                Log.e(TAG, "ride = " + ride);

                Log.d(TAG, "Driver = " + ride.getDriver());
                Log.d(TAG, "Rating = " + ride.getRating());
                Log.d(TAG, "Rider = " + ride.getRider());
                Log.d(TAG, "Price = " + ride.getRidePrice());
                Log.d(TAG, "status = " + ride.getStatus());
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

上面的代码只使它成为日志“我做到了getKeyAndStatus:onDataChange”

编辑 - 结果

结果

标签: javaandroidfirebasefirebase-realtime-database

解决方案


要解决此问题,请使用以下代码:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference historyRef = rootRef.child("History");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Ride ride = ds.getValue(Ride.class);

            Log.d(TAG, "Driver = " + ride.getDriver());
            Log.d(TAG, "Rating = " + ride.getRating());
            Log.d(TAG, "Rider = " + ride.getRider());
            Log.d(TAG, "Price = " + ride.getRidePrice());
            Log.d(TAG, "status = " + ride.getStatus());
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
historyRef.addListenerForSingleValueEvent(valueEventListener);

logcat 中的输出将是您的属性的值。

请注意,使用以下代码行时:

rideKey = String.valueOf(mDatabase.child("History").push().getKey());

您正在生成另一个密钥,而不是获取现有密钥。push()仅在添加对象时使用该方法,而不是在读取对象时使用。


推荐阅读