安卓:获取子视图的子视图

4

我正在尝试获取我的“历史”节点中当前“乘车”的“状态”,但首先我必须获取“rideKey”。

全局变量:String rideKey,String key。

历史节点:

{
  "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) {}
    });

这个代码给我返回了History中的所有键,如何获取最近的一个键呢?

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

但是,当我尝试获取状态时,它一直返回 null。
我已经尝试在rideKey值事件内部放置另一个ValueEventListener,但仍然为 null。

有什么想法,我做错了什么吗? 非常感谢。

编辑

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”。
编辑-结果
点击results链接查看结果。

这是用户ID吗? "-LGXaukR30LTjrL3ZNpt" - Ticherhaz FreePalestine
我尝试通过创建另一个方法并放置DatabaseReference keyRef = FirebaseDatabase.getInstance().getReference("History").child(rideKey)来从value事件监听器中获取rideKey/requestId,但结果为null。我猜它是在作用域之外? - LizG
我可以先获取子元素“status”的键再获取值吗? - LizG
对不起,把什么变成双倍?rideKey?它是字母和数字的组合。我可以获取密钥,但它会给我历史节点中的所有密钥,我似乎无法获取“状态”的值。 - LizG
@LizG 请检查我的答案 - Khaled Lela
显示剩余2条评论
3个回答

2
为了解决这个问题,请使用以下代码:
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()方法,而不是在读取它们时。

他还是无法访问rideKey吗? - Ticherhaz FreePalestine
1
通过使用getChildren()方法循环遍历DataSnapshot对象,他可以实现这个功能。 - Alex Mamo
@AlexMamo 完美! - LizG
@AlexMamo 我该如何获取结果,以便它显示当前的历史密钥,因为打印输出显示状态=已接受,而我尚未提交请求。 - LizG
这基本上是另一个问题。为了遵守这个社区的规则,请发布另一个新问题,这样我和其他用户可以帮助您。不要在最初的问题中添加其他问题/问题,而是添加一个新问题。 - Alex Mamo
1
好的,抱歉。我会去做的。 - LizG

0
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);

        DatabaseReference statusRef = FirebaseDatabase.getInstance().getReference("History").Child(rideKey).Child("status");
statusRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            History history = new History(); //If you make class for history
            history = dataSnapshot.getValue(History.class);
            textViewStatus.setText(history.getStatus());
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

我得到了密钥,但状态为null。 - LizG
我添加了一个History.java文件,但是出现了错误,没有任何日志记录错误信息。以下是编辑过的代码,只有在添加上述代码时才会出现此问题: public class History {String status; public History() { } public History(String status) { this.status = status; } public String getStatus() { return status; } public void setStatus(String status) { this.status = status; } } - LizG
History history = new History(); //如果你为历史创建了一个类 history = dataSnapshot.getValue(History.class); textViewStatus.setText(history.getStatus()); - LizG
它仍然为空。 - LizG

0
DatabaseReference historyRef = FirebaseDatabase.getInstance().getReference().child("History");

    historyRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()){
                Log.d(TAG, "getKey: key = " + child.getKey());

                Ride ride = child.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) {

        }
    });
}

//
//       "driver" : "ptnVOKounjXE9VrmZCCvKoZWluf1",
//               "rating" : 0,
//               "ridePrice" : 5.25,
//               "rider" : "C0RjB5NPZcTvWz9XiUAhpTDOK0C2",
//               "status" : "accepted",
//               "timestamp" : 1530662726

class Ride{
    // Remove @Exclude https://firebase.google.com/docs/reference/android/com/google/firebase/database/Exclude
    private String driver;
    private int rating;
    private float ridePrice;
    private String rider;
    private String status;
    private long timestamp;

    public Ride() {
      // Empty Constructor  
    }
      // Getter & Setter 
  }

@LizG getChildren()不起作用 请解释发生了什么,更新问题并附上_Stacktrace_。 - Khaled Lela
检查 dataSnapshot.child("History").getChildren() - Khaled Lela
DatabaseReference keyRef = FirebaseDatabase.getInstance().getReference("History"); keyRef.addValueEventListener(new ValueEventListener() { - LizG
@Override public void onDataChange(DataSnapshot dataSnapshot) { Iterable<DataSnapshot> children = dataSnapshot.child("History").getChildren(); for (DataSnapshot child : children){ Log.d(TAG, "getKey: key = " + child.getKey()); - LizG
Ride ride = child.getValue(Ride.class); Log.d(TAG, "status = " + ride.getStatus()); } - LizG
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接