使用 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_available
和 is_hired
的值在 String
中,您可能想将它们更改为 Boolean
和 Integer
@Willik 方法的问题在于它将下载整个列表,正如他们提到的过滤器客户端。相反,您应该使用索引以不同方式存储数据,以便您更快地进行搜索:
{
driver_available:"true",
is_hired:"0",
driver_available_is_hired: "true_0"
...
}
这通常是 firebase 建议的存储数据的方式。然后你可以做这样的查询:
.ref(...).orderByChild('driver_available_is_hired').equalTo('true_0')
我正在开发一个在地图上显示 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_available
和 is_hired
的值在 String
中,您可能想将它们更改为 Boolean
和 Integer
@Willik 方法的问题在于它将下载整个列表,正如他们提到的过滤器客户端。相反,您应该使用索引以不同方式存储数据,以便您更快地进行搜索:
{
driver_available:"true",
is_hired:"0",
driver_available_is_hired: "true_0"
...
}
这通常是 firebase 建议的存储数据的方式。然后你可以做这样的查询:
.ref(...).orderByChild('driver_available_is_hired').equalTo('true_0')