java - 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”
编辑 - 结果
解决方案
要解决此问题,请使用以下代码:
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()
仅在添加对象时使用该方法,而不是在读取对象时使用。
推荐阅读
- javascript - 如何强制用户在 Angular 中仅上传特定的文件类型
- elasticsearch - ElasticSearch 多个值作为输入(以及正则表达式)以匹配(应该)多个字段
- r - 如何在 R 中使用 fread 读取 .pgn.bz2 文件?
- c# - 如何将以下内容转换为 VB.NET(Where 子句)
- excel - 如何在 excel VBA 用户窗体中显示 excel 工作表图表
- python - 如何创建处理输入字符串或输入文件的 python 脚本?
- angular-grid - 角度 ig-grid 中 dd/MM/YYYY 格式的日期字段中的列排序问题
- python - 我如何在标签小部件中将图像作为 bg 放置,以便文本也可见
- jmeter - Jmeter - 通过单次调用使用 GET/POST
- apache-spark - spark应用程序中的作业已完成,但我仍然看到状态为正在运行,为什么?