我正在构建一个应用程序,允许其用户实时查看特定公司的公共汽车和火车。
到目前为止,一切都很好。但我遇到了一些障碍。我真的需要帮助来了解Firebase的这一部分。
像这样拆分数据库。
我的Firebase数据库
因此,驾驶员进行注册并选择他/她将在其上行驶的路线/线路。
然后它将转到具有“我正在工作”开关的地图,将其切换为“开”时,它将向用户发出“驾驶员位置”,并将驾驶员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/