java - Firebase数据库重复数据

标签 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);


}

最佳答案

好吧,所以我想出了答案,而Zsombi,您是对的,我需要删除ValueEventListener之一。
我做到了并添加了一些反复试验,现在效果很好。

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

关于java - Firebase数据库重复数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54999045/

相关文章:

android - 应用级别的gradle文件中flutterversionNameflutterVersionCode的flutter问题

java、lucene、searcher索引器问题怎么办呢?

java - ListView 正在检查我的 RadioButtons 而没有被触及

java - WebDriver,如何防止 InternetExplorerDriver 控制鼠标指针

android - Xamarin 安卓 : Exception thrown when adding new ImageView to ViewFlipper

android - 在 Android 上使用 SL4A 将参数传递给 python 脚本

android - FCMPluging 和 GooglePlus 冲突

android - 如果其内容包含某些内容,如何查询数据库以获取子项?

java - 如何使用 log4j 和 jboss 记录未捕获的运行时异常?

Firebase admin().auth().getUser(uid) 错误 : An internal error has occurred 'auth/internal-error'