Android: получить ребенка от ребенка - PullRequest
0 голосов
/ 04 июля 2018

Я пытаюсь получить "статус" поездки, который в настоящее время находится в моем узле "History", но сначала мне нужно было получить "rideKey".

Глобальные переменные: String rideKey, String key.

Узел истории:

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

Чтобы получить код поездки, я сделал это:

    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, но все еще 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

Ответы [ 3 ]

0 голосов
/ 04 июля 2018
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 
  }
0 голосов
/ 04 июля 2018

Чтобы решить эту проблему, используйте следующий код:

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() только тогда, когда вы добавляете объекты, а не когда читаете их.

0 голосов
/ 04 июля 2018
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) {

    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...