2016-10-12 1 views
0

지도에 드라이버를 표시하는 앱을 만들고 있습니다. 나는 GeoFire를 사용했다. 내 응용 프로그램에서 사용할 수있는 드라이버 만 표시해야합니다. 더 자세한 정보는 첨부 된 이미지를 참조하십시오.GeoFire를 사용하여 데이터를 필터하십시오.

enter image description here

"is_hired":"0" && "driver_available":"true" 경우에만 다음 드라이버는 다른 사람들이지도에서 제거,지도에 표시되어야합니다.

지금은 Firebase에서 데이터를 사용하여 드라이버를 필터링하는 방법을 모르기 때문에 모든 드라이버가 표시됩니다. GeoFire와

, 나는 드라이버 위치를 업데이트하기 위해 다른 노드를 작성해야하고 그것의 오버라이드 (override) 방법이 있습니다

@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 메서드로 필터링하는 것입니다. 데이터베이스의 driver_availableis_hired의 값이 String에 있기 때문에 BTW

@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 방법을 사용하여, 당신은 BooleanInteger

+0

내 하루를 저장해 주셔서 감사합니다. 잘 작동하지만 다른 쿼리가 있습니다. 추가하는 동안 마커가 필터링됩니다. 추가 된 후 is_hired가 Firebase DB에서 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') 
관련 문제