База данных Firebase дублирует данные - PullRequest
0 голосов
/ 05 марта 2019

Я создаю приложение, которое позволяет пользователям видеть определенные компании Автобусы и поезда в реальном времени.

и пока все хорошо.но я натолкнулся на препятствие.Мне действительно нужна помощь, чтобы понять эту часть Firebase.

База данных разделена следующим образом.

Моя база данных Firebase

enter image description here

Таким образом, драйвер регистрируется и выбираетпо какому маршруту / линии он / она будет ехать.затем он перейдет к карте, на которой есть переключатель «Я работаю», при переключении «Вкл.» он отправляет местоположение драйверов пользователям и помещает UID драйверов и данные о местоположении в узел «driversAvailable».

, но проблема заключается в дублировании UID и данных драйверов в неправильной ветке.Данные драйвера RedLine должны быть в driversAvailable => drivers => RedLine

void saveGeoFire(){
    final DatabaseReference yellowRef = FirebaseDatabase.getInstance().getReference().child("driversAvailable").child("drivers").child("YellowLine");
    final DatabaseReference redRef = FirebaseDatabase.getInstance().getReference().child("driversAvailable").child("drivers").child("RedLine");

    final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();

    final DatabaseReference driversRouteRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Drivers").child("YellowLine");
    final DatabaseReference driversRouteRedRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Drivers").child("RedLine");

    ValueEventListener redRefEventListenter = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists())
            {
                GeoFire geoFire = new GeoFire(redRef);
                geoFire.setLocation(userId, new GeoLocation(mLastLocation.getLatitude(),mLastLocation.getLongitude()));
            }

        }

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

        }
    };

    ValueEventListener driversAvailableEventListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists())
                   {
                       GeoFire geoFire = new GeoFire(yellowRef);
                       geoFire.setLocation(userId, new GeoLocation(mLastLocation.getLatitude(),mLastLocation.getLongitude()));

                   }


                }

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

                }
            };
            driversRouteRef.addListenerForSingleValueEvent(driversAvailableEventListener);
            driversRouteRedRef.addListenerForSingleValueEvent(redRefEventListenter);


}

Ответы [ 2 ]

0 голосов
/ 06 марта 2019

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

что я и сделал.и добавил несколько проб и ошибок, и теперь он отлично работает.

void saveGeoFire(){
    final DatabaseReference yellowRef = FirebaseDatabase.getInstance().getReference().child("driversAvailable").child("drivers").child("YellowLine");
    final DatabaseReference redRef = FirebaseDatabase.getInstance().getReference().child("driversAvailable").child("drivers").child("RedLine");

    final String userId = FirebaseAuth.getInstance().getCurrentUser().getUid();

    final DatabaseReference driversRouteRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Drivers").child("Redline").child("bus");
    final DatabaseReference driversRouteRedRef = FirebaseDatabase.getInstance().getReference().child("Users").child("Drivers");
    ValueEventListener redRefEventListenter = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()) {

                    if(dataSnapshot.child("RedLine").child("bus").getValue().toString().contains(userId)){
                        Toast.makeText(DriverMapActivity.this, "RedLinesuccess", Toast.LENGTH_SHORT).show();
                        GeoFire geoFire = new GeoFire(redRef);
                        geoFire.setLocation(userId, new GeoLocation(mLastLocation.getLatitude(),mLastLocation.getLongitude()));
                    }
                    if(dataSnapshot.child("YellowLine").child("bus").getValue().toString().contains(userId)){
                        Toast.makeText(DriverMapActivity.this, "YellowLine success", Toast.LENGTH_SHORT).show();
                        GeoFire geoFire = new GeoFire(yellowRef);
                        geoFire.setLocation(userId, new GeoLocation(mLastLocation.getLatitude(),mLastLocation.getLongitude()));
                    }

                }
        }

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

        }
    };
    driversRouteRedRef.addListenerForSingleValueEvent(redRefEventListenter);
}

Текущая база данных

0 голосов
/ 05 марта 2019

Похоже, у вас есть два ValueEventListener.Каждые два ValueEventListener имеют объект GeoFire.И они устанавливают позицию пользователя.

Решение может быть, если вы удалите один из ValueEventListener.Одним из них является установка записей в driversAvaliable => drivers => RedLine.Это желаемый результат.

Другой слушатель событий устанавливает записи в driversAvaliable => drivers => YellowLine.Это не ваш желаемый результат.

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

driversRouteRef => points to YellowLine
driversRouteRedRef => points to RedLine

И вы устанавливаете данные для каждой ссылки.Теперь это приведет к дублированию данных с тем же идентификатором пользователя.

Другое решение может изменить вашу логику.

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