我正在保存用户发布的帖子的坐标。我正在生成一个推送 ID,然后使用它来保存帖子数据和 geofire 坐标。
我只想显示那些在 0.5 公里半径范围内的帖子。我在用GeoFire
库相同,但我无法完成任务。
以下是我生成推送 ID 的方法:
itemID = databaseReferenceRequests.push().getKey();
以下是我如何使用它来保存 geofire 坐标以及帖子数据:
geoFire.setLocation(itemID,
new GeoLocation(Double.parseDouble(currentLat.getText().toString()),
Double.parseDouble(currentLng.getText().toString())));
databaseReferenceRequests.child(itemID).setValue(hRequest);
它的保存方式如下:
问题是,当我尝试仅获取距离我的范围 0.5 公里以内的帖子时,这种情况并没有发生,并且所有帖子(无论是近还是远)都会被检索。
这是我检索它的方法:
public void retrieveHelpRequests() {
geoQuery = geoFire.queryAtLocation(new GeoLocation(currentLatDouble, currentLngDouble), 0.5);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
databaseReference.child("help-requests").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Map<String, String> newRequest = (Map<String, String>) dataSnapshot.getValue();
imageUID = newRequest.get("imageUIDh");
homelessDescription = newRequest.get("homelessDescription");
currentLat = newRequest.get("currentLat");
currentLng = newRequest.get("currentLng");
postedBy = newRequest.get("postedBy");
postedAtTime = newRequest.get("postedAtTime");
postedOnDate = newRequest.get("postedOnDate");
utcFormatDateTime = newRequest.get("utcFormatDateTime");
String timeStr = utcFormatDateTime;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = null;
try {
// error on line below
date = df.parse(timeStr);
} catch (ParseException e) {
e.printStackTrace();
}
df.setTimeZone(TimeZone.getDefault());
final String persisted = df.format(date);
// Parse string from DB - UTC timezone
Date parsed = null;
try {
parsed = df.parse(persisted);
} catch (ParseException e) {
e.printStackTrace();
}
// Now convert to whatever timezone for display purposes
final SimpleDateFormat displayFormat = new SimpleDateFormat("h:mm a");
displayFormat.setTimeZone(TimeZone.getDefault());
formattedTime = displayFormat.format(parsed);
prepareDataForRequests();
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, databaseError.getMessage(), Snackbar.LENGTH_LONG);
snackbar.setDuration(Snackbar.LENGTH_SHORT);
snackbar.show();
// helpRequestsLoadingDialog.dismiss();
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
});
databaseReference.child("help-requests").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot dataSnapshot) {
// adView.loadAd(request);
card_ads2.setVisibility(View.VISIBLE);
adView2.loadAd(request2);
if (snackbar != null) {
snackbar.dismiss();
}
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
if (fastItemAdapter.getAdapterItemCount() == 0) {
emptyRVtext.setVisibility(View.VISIBLE);
emptyRVtexthh.setVisibility(View.VISIBLE);
card_ads2.setVisibility(View.INVISIBLE);
} else {
emptyRVtext.setVisibility(View.INVISIBLE);
emptyRVtexthh.setVisibility(View.INVISIBLE);
}
// progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
@Override
public void onCancelled(DatabaseError databaseError) {
Snackbar snackbar = Snackbar
.make(coordinatorLayout, databaseError.getMessage(), Snackbar.LENGTH_LONG);
snackbar.setDuration(Snackbar.LENGTH_SHORT);
snackbar.show();
// hRequestsLoadingDialog.dismiss();
progressBarLoadingRequests.setVisibility(View.INVISIBLE);
}
});
}
@Override
public void onKeyExited(String key) {
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Toast.makeText(getBaseContext(), "Error retriving geoquery", Toast.LENGTH_SHORT).show();
}
});
}
这是错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'int java.lang.String.length()' on a null object reference
请告诉我如何仅检索用户 0.5 公里范围内的帖子?