Как я могу отобразить все маркеры из базы данных Firebase? - PullRequest
0 голосов
/ 19 апреля 2020

как отобразить все маркеры из базы данных firebase?

Я ввел в базу данных данные в этой форме:

enter image description here

но отображается только то, что выделено на чертеже! Я пишу код так:

@Override
public void onMapReady(GoogleMap googleMap) {
    if (!isOnline() && !isNetworkAvailable()) {
    } else {
        Map1 = googleMap;
        Map1.setMapType(GoogleMap.MAP_TYPE_NORMAL);

        Map1.setMapStyle(mapStyleOptions);
        Map1.setOnMyLocationButtonClickListener(this);
        Map1.setOnMyLocationClickListener(this);
        if (Map1 == null) {
            Map1.setMyLocationEnabled(true);
        }
        startCurrentLocationUpdates();

        mHandler.postDelayed(new Runnable(){
            public void run(){
                DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
                DatabaseReference uidRef = rootRef.child("Markers");
                Map.clear();
                ValueEventListener valueEventListener = new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot ds: dataSnapshot.getChildren()) {

                            String latitude = ds.child("latitude").getValue().toString();
                            String longitude = ds.child("longitude").getValue().toString();
                            String bus = ds.child("bus_station").getValue().toString();
                            Log.d("TAG", latitude + ", " + longitude);
                            LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));

                                Map.addMarker(new MarkerOptions().icon(BitmapDescriptorFactory.fromResource(R.drawable.img_4662878)).position(location).title(bus));
                            }}}}

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


                mHandler.postDelayed(this, delay);
            }
        }, delay);
    }}

подскажите, как правильно отображать все маркеры из базы данных?

ошибка:

2020-04-22 23:10:12.031 18972-18972/by.sviter.stop E/AndroidRuntime: FATAL EXCEPTION: main
Process: by.sviter.stop, PID: 18972
java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.trim()' on a null object reference
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1838)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at by.sviter.stoprevizor.tabs.maps.MapsFragment$3$1.onDataChange(MapsFragment.java:337)
    at com.google.firebase.database.Query$1.onDataChange(com.google.firebase:firebase-database@@19.2.1:179)
    at com.google.firebase.database.core.ValueEventRegistration.fireEvent(com.google.firebase:firebase-database@@19.2.1:75)
    at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@19.2.1:63)
    at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@19.2.1:55)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:193)
    at android.app.ActivityThread.main(ActivityThread.java:6718)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:495)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Ответы [ 3 ]

1 голос
/ 20 апреля 2020

Предполагая, что dn4O ... mgG2 - это uid аутентифицированного пользователя, чтобы получить значения свойств широты и долготы, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Markers").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String latitude = dataSnapshot.child("latitude").getValue(String.class);
        String longitude = dataSnapshot.child("longitude").getValue(String.class);
        Log.d("TAG", latitude + ", " + longitude);
        LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));

        //Do what you need to do with the location
    }

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

Результат в логат будет:

53.9148950..., 27.4380507...

Редактировать:

Согласно вашему комментарию:

как показать все теги?

Пожалуйста, используйте следующие строки кода:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference markersRef = rootRef.child("Markers");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String latitude = ds.child("latitude").getValue(String.class);
            String longitude = ds.child("longitude").getValue(String.class);
            Log.d("TAG", latitude + ", " + longitude);
            LatLng location = new LatLng(Double.parseDouble(latitude), Double.parseDouble(longitude));

            //Add the location to a list of locations
        }
    }

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

Результат в logcat будет:

// ...
// ...
53.9148950..., 27.4380507...
0 голосов
/ 20 апреля 2020

Вы должны использовать addValueEventListner вместо addListenerForSingleValueEvent

Вы должны запустить для l oop, чтобы получить все данные, такие как ...

DatabaseReference rootRef = FirebaseDatabase.getInstance (). GetReference (); rootRef.child ("Markers"). addValueEventListner (new ValueEventListner {

@ Override publi c void onDataChange (DataSnapshot dataSnapshot) {для (моментальный снимок DataSnapshot: dataSnapshot.getChildern ()) {приведен в модель }}

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }

});

0 голосов
/ 19 апреля 2020

После того как область действия DataSnapshot для l oop закончилась, вы можете манипулировать содержимым объекта DataModel с помощью методов получения и установки, которые вы должны были реализовать.

Если это не работает. Проверьте, указывает ли ваш объект mMarkers1 на правильный класс, или измените addListenerForSingleValueEvent на addValueEventListener.

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