Estoy tratando de obtener el "estado" del paseo que se encuentra actualmente en mi nodo de "Historia", pero primero tenía que conseguir la "rideKey".
Las variables globales: Cadena rideKey, clave de cadena.
nodo de la historia:
{
"History" : {
"-LGXaukR30LTjrL3ZNpt" : {
"driver" : "ptnVOKounjXE9VrmZCCvKoZWluf1",
"rating" : 0,
"ridePrice" : 5.25,
"rider" : "C0RjB5NPZcTvWz9XiUAhpTDOK0C2",
"status" : "accepted",
"timestamp" : 1530662726
}
}
}
Para obtener el rideKey, hice esto:
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) {}
});
Esto me todas las claves de la historia da, ¿cómo puedo obtener la más reciente?
Ahora bien, yo, también es necesario para obtener el "status" de la solicitud.
Sin embargo, cuando intento para obtener el estado, que sigue apareciendo nula.
He intentado poner otro ValueEventListener dentro del evento valor rideKey pero aún nula
Alguna idea de lo que estoy haciendo mal? Muy apreciado.
EDITAR
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) {
}
});
El código anterior sólo lo hace por lo que el registro de "lo hice a getKeyAndStatus: onDataChange"
Edición - Resultados
Para solucionar esto, por favor, utilice el siguiente código:
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);
La salida en el Logcat serán los valores de sus propiedades.
Tenga en cuenta, cuando se utiliza la siguiente línea de código:
rideKey = String.valueOf(mDatabase.child("History").push().getKey());
Estás generando otra tecla en vez de conseguir la existente. Utilice el push()
método sólo cuando se agrega objetos no cuando se las lee.