我正在开发一款在地图上显示驱动程序的应用程序。我使用GeoFire。在我的应用程序中,我只需要显示那些可用的驱动程序。 请参阅附图以获取更多信息。
如果"is_hired":"0" && "driver_available":"true"
,则只有驱动程序会在地图上显示,否则会从地图中删除。
目前,它显示所有驱动程序,因为我不知道如何使用Firebase上的数据过滤驱动程序。
使用GeoFire,我需要创建一个不同的节点来更新驱动程序位置,并且它有重写的方法:
@Override
public void onKeyEntered(String key, GeoLocation location) {
Log.e("KEY","KEY-->> " + key);
Log.e("Location","Location-->> " + location.latitude+","+location.longitude);
Toast.makeText(HomeActivity.this, "Marker Added", Toast.LENGTH_SHORT).show();
// Add a new marker to the map
Marker marker = this.googleMap.addMarker(new MarkerOptions().position(new LatLng(location.latitude, location.longitude)));
this.driverMarkers.put(key, marker);
}
@Override
public void onKeyExited(String key) {
// Remove any old marker
Toast.makeText(HomeActivity.this, "Marker removed", Toast.LENGTH_SHORT).show();
Marker marker = this.driverMarkers.get(key);
if (marker != null) {
marker.remove();
this.driverMarkers.remove(key);
}
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
// Move the marker
Marker marker = this.driverMarkers.get(key);
if (marker != null) {
this.animateMarkerTo(marker, location.latitude, location.longitude);
}
}
如何过滤那些未被雇佣和可用的标记?
在GeoFire之前,我使用的是Firebase数据库查询。它的缺点是它获取了整个数据库驱动程序。我只需要显示附近的司机。 请帮助我。
答案 0 :(得分:2)
执行此操作的方法是在onKeyEntered
方法中过滤客户端中的驱动程序。
@Override
public void onKeyEntered(String key, GeoLocation location) {
ref.child("drivers").child(key).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Driver driver = dataSnapshot.getValue(Driver.class);
if (driver.getIs_hired().equals("0") && driver.getDriver_available().equals("true")) {
Marker marker = this.googleMap.addMarker(new MarkerOptions().position(new LatLng(location.latitude, location.longitude)));
this.driverMarkers.put(key, marker);
}
}
...
});
}
...
顺便说一句,我使用equals
方法,因为数据库中driver_available
和is_hired
的值在String
中,您可能希望将它们更改为{{1} }和Boolean
答案 1 :(得分:0)
@ Willik方法的问题在于它会下载整个列表,因为他们提到了过滤客户端。相反,您应该使用可以更快搜索的索引来存储数据:
{
driver_available:"true",
is_hired:"0",
driver_available_is_hired: "true_0"
...
}
这通常是firebase建议存储数据的方式。然后你可以进行如下查询:
.ref(...).orderByChild('driver_available_is_hired').equalTo('true_0')