使用 GeoFire 过滤数据

Filter Data using GeoFire

我正在开发一个在地图上显示 driver 的应用程序。为此,我使用了 GeoFire。在我的应用程序中,我只需要显示那些可用的 driver。 请参阅所附图片以获取更多信息。

如果 "is_hired":"0" && "driver_available":"true",只有这样 driver 才会显示在地图上,否则它们会从地图中删除。

目前,它显示所有 driver,因为我不知道如何使用其在 Firebase 上的数据过滤 driver。

使用 GeoFire,我需要创建一个不同的节点来更新 driver 位置,它有其覆盖的方法:

@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 数据库查询。它的缺点是它正在获取整个数据库 drivers。我只需要显示附近的 drivers。 请帮助我。

实现方法是在客户端里面过滤驱动程序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 中,您可能想将它们更改为 BooleanInteger

@Willik 方法的问题在于它将下载整个列表,正如他们提到的过滤器客户端。相反,您应该使用索引以不同方式存储数据,以便您更快地进行搜索:

{
    driver_available:"true",
    is_hired:"0",
    driver_available_is_hired: "true_0"
    ...
}

这通常是 firebase 建议的存储数据的方式。然后你可以做这样的查询:

.ref(...).orderByChild('driver_available_is_hired').equalTo('true_0')