使用GeoFire过滤数据

时间:2016-10-12 06:24:53

标签: android firebase firebase-realtime-database geofire

我正在开发一款在地图上显示驱动程序的应用程序。我使用GeoFire。在我的应用程序中,我只需要显示那些可用的驱动程序。 请参阅附图以获取更多信息。

enter image description here

如果"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数据库查询。它的缺点是它获取了整个数据库驱动程序。我只需要显示附近的司机。 请帮助我。

2 个答案:

答案 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_availableis_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')