Не совсем понимаю, как найти местоположение маркера из базы данных Firebase - PullRequest
0 голосов
/ 23 января 2019

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

это мой код для чтения из базы данных:

mLocation.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                MarkerLocation markerLocation = dataSnapshot.child("location").getValue(MarkerLocation.class);
                for (DataSnapshot s : dataSnapshot.getChildren()){
                double latitude = (double) (s.child("lat").getValue());
                double longitude = (double) ((s.child("lng").getValue()));
                LatLng location = new LatLng(latitude,longitude);
                mMap.addMarker(new MarkerOptions().position(location));
                }
            }

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

            }
        });

и база данных Firebase выглядят так:

  • применение

      -location
            -marker
                 -latitude:43.849
                 -longitude:-109.737
    

Любая помощь оценена.

Ответы [ 4 ]

0 голосов
/ 23 января 2019

Возможно, вы не получаете обновления, потому что используете API-интерфейс addListenerForSingleValueEvent, который будет выполнять однократный запрос узла базы данных.Если вы хотите подключить прослушиватель таким образом, чтобы вы могли получать обновления каждый каждый раз, когда меняется узел, вам нужно использовать API addValueEventListener.

0 голосов
/ 23 января 2019

Попробуйте это:

@Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                MarkerLocation markerLocation = dataSnapshot.child("location").getValue(MarkerLocation.class);
                LatLng location = new LatLng(markerLocation.latitude, markerLocation.longitude);
                mMap.addMarker(new MarkerOptions().position(location));

                }
            }
0 голосов
/ 23 января 2019

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

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference locationRef = rootRef.child("location");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            MarkerLocation markerLocation = ds.getValue(MarkerLocation.class);
            LatLng latLng = new LatLng(markerLocation.getLatitude(), markerLocation.getLongitude());
            mMap.addMarker(new MarkerOptions().position(latLng));
            Log.d(TAG, markerLocation.getLatitude() + ", " +  markerLocation.getLongitude());
        }
    }

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

Если вы устанавливаете значения непосредственно в общедоступных полях, измените следующую строку кода:

LatLng latLng = new LatLng(markerLocation.getLatitude(), markerLocation.getLongitude());

до

LatLng latLng = new LatLng(markerLocation.latitude, markerLocation.longitude);
0 голосов
/ 23 января 2019

Если ваша конфигурация верна, вы сможете отобразить маркер с:

LatLng loc = new LatLng(-33.852, 151.211);
googleMap.addMarker(new MarkerOptions().position(loc)
            .title("Marker"));

Кроме того, если ваша база данных Firebase является той, которую вы опубликовали ранее, взгляните на ключи: выиспользуя

double latitude = (double) (s.child("lat").getValue());
double longitude = (double) ((s.child("lng").getValue()));

Но это должно быть:

double latitude = (double) (s.child("latitude").getValue());
double longitude = (double) ((s.child("longitude").getValue()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...