Невозможно получить значение child в firebase, кроме null - PullRequest
0 голосов
/ 07 февраля 2019

Не уверен, почему, но с моим кодом, я не могу получить значение 'isOnline':

dolRef = DatabaseReference dolRef = FirebaseDatabase.getInstance().getReference("DriversOnline");
dolRef = dolRef.child("iosDriver");
dolRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String driverid = ds.getKey();

            // get value of 'isOnline'
            dolRef = dolRef.child(driverid);
            Log.e(TAG, "dolRef: " + dolRef);
            dolRef.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    for(DataSnapshot dss : dataSnapshot.getChildren()) {
                        String online = dss.child("isOnline").getValue(String.class);
                        Log.e(TAG, "Online: " + online);
                    }
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Ниже приведена часть моей базы данных firebase:

"DriversOnline" : {
    "iosDriver" : {
      "BruEGfToc8axIWJk1o01fxcwd8I2" : { // driverId
        "isOnline" : "true",
        "latitude" : 45.276,
        "longitude" : -66.064
      }
    }
  }

Есть идеи, почему я не могу получить значение 'isOnline', кроме нуля?

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019
driverid = FirebaseDatabase.getInstance().getReference("driver");//If there is another driver table, the path must be two layers.
driverid.addValueEventListener(new ValueEventListener() {
             @Override
             public void onDataChange(DataSnapshot dataSnapshot) {
                  Driver driver = dataSnapshot.getValue(Driver.class);//class model

                 dolRef = FirebaseDatabase.getInstance().getReference("DriversOnline/iosDriver").child(driver.getDriverID);
                 dolRef.addValueEventListener(new ValueEventListener() {
                        @Override
                         public void onDataChange(DataSnapshot dataSnapshot) {

                            DriversOnline driversOnline= dataSnapshot.getValue(DriversOnline .class);//class model
                        log.d("driverid","isOnline :"+driversOnline.getisOnline)
                        //display -> isOnline : true


            }

                  @Override
                   public void onCancelled(DatabaseError databaseError) {

                 }
        });

}

@Override
public void onCancelled(DatabaseError databaseError) {

}
});
0 голосов
/ 07 февраля 2019

Я думаю, что вы вкладываете своих слушателей на один уровень глубже, чем нужно.

DatabaseReference iosRef = FirebaseDatabase.getInstance().getReference("DriversOnline/iosDriver");
iosRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot driverSnapshot: dataSnapshot.getChildren()) {
            String driverid = driverSnapshot.getKey();

            DataSnapshot isOnlineSnapshot = driverSnapshot.child("isOnline");

            System.out.println(isOnlineSnapshot.getValue(String.class));
        }
    }

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

Некоторые замечания:

  • Переназначение одной общей переменной dolRef 4 разав таком блоке кода есть запах кода.Намного сложнее следить за происходящим и проверять, указывает ли переменная на правильное место.Дайте каждому из них имя, которое четко указывает на то, на что они указывают, как я уже делал выше.
  • Нет необходимости подключать второго слушателя, поскольку значение isOnline прямо в driverSnapshot.Вы можете просто запросить дочерний снимок с правильным именем и затем значением из этого.
  • Не игнорируйте ошибку, так как это скрывает потенциальные проблемы.По крайней мере, бросьте их, как я сделал выше.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...