Как получить две переменные из базы данных Firebase в реальном времени - PullRequest
0 голосов
/ 16 ноября 2018
static double lat2;

static double lon2;

private void InitMapElements() {

DatabaseReference zonesRef = FirebaseDatabase.getInstance().getReference("markers");

DatabaseReference zone1Ref = zonesRef.child("m-1"); //database path
DatabaseReference zone1NameRef = zone1Ref.child("latit");

DatabaseReference zone2NameRef = zone1Ref.child("longit");

    zone1NameRef.addValueEventListener(new ValueEventListener() { //reading the first coordinate

        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Double lat1 = dataSnapshot.getValue(Double.class);
            lat2 = lat1;
        }

        @Override
        public void onCancelled(DatabaseError error) {
            // Failed to read value
        }
    });
    zone2NameRef.addValueEventListener(new ValueEventListener() { //reading the second coordinate
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Double lon1 = dataSnapshot.getValue(Double.class);
            lon2 = lon1;

        }

       @Override
        public void onCancelled(DatabaseError error) {
        }
    });
}

Невозможно получить две переменные онлайн и затем сохранить их в статическую переменную из базы данных Firebase реального времени, переменные получают значение только один раз при вызове метода.С одной переменной все работает нормально.Переменная меняется, если вы меняете значение на основе, но с двумя не работает.

пример работы с одной переменной

1 Ответ

0 голосов
/ 16 ноября 2018

Нет необходимости подключать двух слушателей, чтобы получить эти два значения.Один слушатель может решить вашу проблему.Чтобы решить эту проблему, используйте следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference ref = rootRef.child("markers").child("m-1");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        double lat = dataSnapshot.child("latit").getValue(Double.class);
        double lon = dataSnapshot.child("longit").getValue(Double.class);
        Log.d(TAG, lat + ", " + lon);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
ref.addListenerForSingleValueEvent(valueEventListener);

Как видите, оба значения извлекаются из объекта DataSnapshot.Обе переменные lat и lon будут доступны только внутри обратного вызова, внутри onDataChange() из-за асинхронного поведения этого метода.Если вы хотите использовать их вне, я рекомендую вам посмотреть последнюю часть моего ответа из этого поста , в котором я объяснил, как это можно сделать с помощью пользовательского обратного вызова.Вы также можете взглянуть на это видео для лучшего понимания.

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