2016-10-12 81 views
0

我正在研究在地圖上顯示驅動程序的應用程序。我爲此使用了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

執行此操作的方法是在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

+0

感謝哥們拯救我的一天。它的工作正常,但我有另一個查詢。標記會在添加時得到過濾,如果添加它們,然後在Firebase數據庫中將is_hired更改爲1,那麼我如何獲取該事件?那時驅動程序的位置沒有改變,所以onKeyMoved方法將不起作用。 –

+0

以獲取更新,將'addListenerForSingleValueEvent'更改爲'addValueEventListener' – Wilik

0

與@ Willik的方法是,這個問題它會下載整個列表和他們提到的過濾客戶端。相反,你應該用,可以讓你更快的搜索索引存儲不同的數據:

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

這是一般如何火力建議存儲數據。然後你可以做一個查詢,如:

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