Попытка получить данные широты и долготы из Firebase

Итак, я пытаюсь показать маркер на карте Google на основе данных широты и долготы из моей базы данных Firebase.

Моя структура Firebase выглядит следующим образом:

Попытка получить данные широты и долготы из Firebase

Теперь это мой код для отображения маркера

@Override
    public void onMapReady(GoogleMap googleMap) {
        mMap = googleMap;
        mReff=FirebaseDatabase.getInstance().getReference().child("01");
        mReff.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot s : dataSnapshot.getChildren()){
                    String lat =s.child("latitude").getValue().toString();
                    String lng =s.child("longitude").getValue().toString();

                    double latitude=Double.parseDouble(lat);
                    double longitude=Double.parseDouble(lng);
                    LatLng lokasi = new LatLng(latitude,longitude);
                    mMap.addMarker(new MarkerOptions().position(lokasi).title(s.child("nama").getValue().toString()));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

Но я всегда получаю эту ошибку

E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.proyekakhir.Aplikasi, PID: 1583
    java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference
        at com.proyekakhir.Aplikasi.Lacak$1.onDataChange(Lacak.java:48)
        at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@17.0.0:184)
        at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@17.0.0:75)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@17.0.0:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@17.0.0:55)
        at android.os.Handler.handleCallback(Handler.java:790)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6499)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:442)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)

Вы можете попробовать поместить код firebase в oncreate() и попробовать?

Nisarg 23.07.2019 08:50

Я пробовал и все равно выдает ошибку

nauzi fikri 23.07.2019 09:00

@nauzifikri В вашей структуре firebase у вас есть только «Широта» и «Долгота» под ключом «01», и вы пытаетесь получить доступ к s.child("nama").getValue() с помощью метода toString(), но ваш "nama " значение равно null, поэтому вы не можете вызвать метод из значения null, проверьте это.

ChandraShekhar Kaushik 23.07.2019 09:01

Итак, я удаляю этот s.child("nama").getValue, но он все равно выдает ту же ошибку.

nauzi fikri 23.07.2019 09:06

@nauzifikri Возможно, вы не получаете значения широты и долготы оба или одно из них, проверьте свой код путем отладки.

ChandraShekhar Kaushik 23.07.2019 09:09

Да, я пытался его отладить, и он всегда выдавал одну и ту же ошибку, поэтому мне интересно, есть ли неправильная строка или где я ошибаюсь в приведенном выше коде.

nauzi fikri 23.07.2019 09:13

пожалуйста, убедитесь, что вы получаете значение путем отладки, когда вы входите в вышеуказанный метод, добавьте отладку для начальной строки цикла. s.child("широта").getValue() s.child("долгота").getValue()

ChandraShekhar Kaushik 23.07.2019 09:30

убедитесь, что ваш dataSnapshot имеет значения, к которым вы пытаетесь получить доступ

ChandraShekhar Kaushik 23.07.2019 09:34
0
8
1 372
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вам не нужно использовать этот цикл for, потому что вы уже установили ссылку на узел 01.

mReff.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       double latitude = Double.parseDouble(dataSnapshot.child("latitude").getValue().toString());
       double longitude = Double.parseDouble(dataSnapshot.child("longitude").getValue().toString());
       LatLng lokasi = new LatLng(latitude,longitude);
       mMap.addMarker(new 
       MarkerOptions().position(lokasi).title("Title"));
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
    });

Итак, я попробовал, но выдает ошибку: несовместимые типы: объект не может быть преобразован в двойной

nauzi fikri 23.07.2019 09:19
Ответ принят как подходящий
mReff.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
       HashMap<String, Double> data = (HashMap<String, Double>) dataSnapshot.getValue();
       double latitude = data.get("latitude");
       double longitude = data.get("longitude");
      // your further code.
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {

    }
    });

я попробовал это, и это дает мне ошибку: несовместимые типы: объект не может быть преобразован в HashMap<String,Double>

nauzi fikri 23.07.2019 09:22

@nauzi проверьте мой обновленный ответ с помощью typecast .. Я проверил, он работает

Nik 23.07.2019 09:28

я не могу проголосовать, к сожалению, у меня нет репутации 15, но я могу принять ответ, спасибо, сэр

nauzi fikri 23.07.2019 09:41

Другие вопросы по теме