【问题标题】:Filter Data using GeoFire使用 GeoFire 过滤数据
【发布时间】:2016-10-12 06:24:53
【问题描述】:

我正在开发一个在地图上显示司机的应用程序。我为此使用了 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 数据库查询。它的缺点是它要获取整个数据库驱动程序。我只需要显示附近的司机。 请帮帮我。

【问题讨论】:

    标签: android firebase firebase-realtime-database geofire


    【解决方案1】:

    这样做的方法是在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

    【讨论】:

    • 感谢好友拯救了我的一天。它工作正常,但我有另一个问题。添加时标记会被过滤,如果添加它们,然后在 Firebase DB 中将 is_hired 更改为 1,那么我该如何获取事件?此时驱动的位置没有改变,所以“onKeyMoved”方法将不起作用。
    • 要获取更新,请将addListenerForSingleValueEvent 更改为addValueEventListener
    【解决方案2】:

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

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

    这通常是 Firebase 建议存储数据的方式。然后您可以进行如下查询:

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

    【讨论】:

      猜你喜欢
      • 2016-03-24
      • 2018-09-26
      • 1970-01-01
      • 2013-08-19
      • 1970-01-01
      • 1970-01-01
      • 2013-09-29
      • 1970-01-01
      相关资源
      最近更新 更多