Firebase数据库重复数据

时间:2019-03-05 09:06:01

标签: java android firebase firebase-realtime-database

我正在构建一个应用程序,允许其用户实时查看特定公司的公共汽车和火车。

到目前为止,一切都很好。但我遇到了一些障碍。我真的需要帮助来了解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 :(得分:1)

好的,所以我找出了答案,然后Zsombi,您在正确的位置,我需要删除其中一个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);
}

Current Database

答案 1 :(得分:0)

好像您有两个ValueEventListener。每两个ValueEventListener都有一个GeoFire对象。他们设置用户的位置。

解决方案可能是删除ValueEventListener之一。其中之一是将记录设置为driversAvaliable => drivers => RedLine。这是您想要的结果。

其他事件侦听器将记录设置为driversAvaliable => drivers => YellowLine。这不是您想要的结果。

您看到的是,您使用了两个数据库引用,并且彼此指向不同的子项。

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

然后将数据设置到每个引用。现在,这将导致具有相同用户ID的数据重复。

其他解决方案可能正在改变您的逻辑。