我正在构建一个应用程序,允许其用户实时查看特定公司的公共汽车和火车。
到目前为止,一切都很好。但我遇到了一些障碍。我真的需要帮助来了解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);
}
答案 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);
}
答案 1 :(得分:0)
好像您有两个ValueEventListener。每两个ValueEventListener都有一个GeoFire对象。他们设置用户的位置。
解决方案可能是删除ValueEventListener之一。其中之一是将记录设置为driversAvaliable => drivers => RedLine。这是您想要的结果。
其他事件侦听器将记录设置为driversAvaliable => drivers => YellowLine。这不是您想要的结果。
您看到的是,您使用了两个数据库引用,并且彼此指向不同的子项。
driversRouteRef => points to YellowLine
driversRouteRedRef => points to RedLine
然后将数据设置到每个引用。现在,这将导致具有相同用户ID的数据重复。
其他解决方案可能正在改变您的逻辑。