Лучше, чем datasnapshot для извлечения определенных данных c из Firebase для каждой конкретной записи c? Неправильное расположение - PullRequest
1 голос
/ 26 января 2020

Необходимо извлечь Latitude и Longitude для каждого указанного события c из Firebase, где пользователь при создании события также выбирает местоположение события (Latitude и Longitude), устанавливая маркер на определенное значение c расположение.

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

Например, если я создаю три события и их местоположения - Рим, Берлин и Москва, единственным маркером, который будет создан на GoogleMap, будет событие в Москве, потому что это было последнее сохраненное местоположение.

Я бы хотел, чтобы второй пользователь нажимал на TextView, используя каждый спецификационный номер события c postid, чтобы это событие было найдено в базе данных и чтобы его специфические c координаты отображались на карте. Может кто-нибудь, пожалуйста, помогите мне достичь этого? Я пытался достичь этого с помощью datasnapshot, но я не смог найти другие места проведения мероприятий. Я всегда просто сохраняю местоположение последнего события для всех сообщений. Есть ли лучший способ сделать это, чем datasnapshot?

Изображение, показанное ниже, поможет понять, как организована моя структура данных.

Структура данных Firebase

MapsActivityUser. java

public class MapsActivityUser extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap map;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps_user);

        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
        mapFragment.getMapAsync(this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        map = googleMap;

        final DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    Post post = snapshot.getValue(Post.class);
                    if (post != null) {
                        double latitude = post.getLocation().getLatitude();
                        double longitude = post.getLocation().getLongitude();

                        LatLng location = new LatLng(latitude, longitude);
                        map.addMarker(new MarkerOptions().position(location).title("Event location"));
                        map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));
                    } else {
                        Toast.makeText(MapsActivityUser.this, "Event doesn't have location on Map", Toast.LENGTH_SHORT).show();
                    }
                }
            }

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

            }
        });
    }
}

Ответы [ 2 ]

1 голос
/ 29 января 2020

Проблема в вашем коде заключается в использовании следующей строки кода:

map.moveCamera(CameraUpdateFactory.newLatLngZoom(location, 10));

Внутри для l oop, что в основном означает, что ваша камера будет перемещена в последнее местоположение, которое повторяется в л oop. Однако, если вы увеличите масштаб, вы сможете увидеть все места на карте. Согласно вашему последнему комментарию:

Как я могу сделать так, чтобы только маркер для местоположения этого определенного c события появлялся, а другие - нет?

В этом случае вам следует использовать запрос. По сути, вы скажете Firebase возвращать только одно местоположение, соответствующее вашему запросу. Это должно выглядеть так:

Query query = reference.orderByChild("locationName").equalTo("locationName");

Теперь просто присоедините слушателя к этому query и добавьте маркер на карту. В этом случае рекомендуется переместить камеру в нужное место, поскольку вы получаете только одно местоположение. Но имейте в виду, что этот запрос будет работать, если у вас есть уникальные имена местоположений. Если вы также храните идентификатор местоположения, вы можете использовать только DatabaseReference, который выглядит следующим образом:

DatabaseReference locationRef = reference.child(locationId);

Присоедините слушателя и добавьте маркер на карту.

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

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

Query query = reference.orderByChild("postid").equalTo("-LzNDAXtnT6NXYK2XYPK");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            double latitude = ds.child("location").child("latitude").getValue(Double.class);
            double longitude = ds.child("location").child("longitude").getValue(Double.class);
            Log.d(TAG, latitude + ", " + longitude);
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
query.addListenerForSingleValueEvent(valueEventListener);
0 голосов
/ 26 января 2020

Прослушивание обратного вызова коллекции (Query Snapshot), внутри функции обратного вызова forl oop, там вы получите класс documentchanges, где вы будете добавлены, удалены, модифицированы индикатор, который указывает, когда данные добавляются, удаляются и изменяются, соответственно выполняют ваши логи c. чтобы получить документ, используйте getId, где он будет возвращать весь идентификатор документа, присутствующий в коллекциях. Я не за p c, просто проверьте в Google.

Я скоро отредактирую решение.

...