我正在开发一个应用程序并在 Firebase 数据库中保存一些字符串,例如 postedAtTime
、postedBy
、postedOnDate
。我想将 GeoFire 坐标保存在保存上述所有字符串的同一节点中,以便稍后我可以轻松地进行查询。
这是我保存所有字符串的路径:
databaseReferenceHRequests = firebaseDatabase.getReferenceFromUrl("https://appName-e1a35.firebaseio.com/requests/");
这就是我保存它的方式:
// in onButtonClicked method:
postNewRequest(null, imageUID, MainActivity.userName.getText().toString(), time, date, utcFormatDateTime, MainActivity.userEmail.getText().toString(), geoFire);
// the method:
public void postNewRequest(Bitmap bitmap, String imageUIDh, String postedBy, String postedAtTime, String postedOnDate, String utcFormatDateTime, String userEmail, GeoFire geoFire) {
HRequest hRequest = new HelpRequest(null, imageUIDh, postedBy, postedAtTime, postedOnDate, utcFormatDateTime, userEmail, geoFire);
databaseReferenceHRequests.push().setValue(hRequest);
}
以下是它在数据库中的保存方式:
我想要的是将 GeoFire 坐标保存在同一节点中,即 -KLIoLUsI0SpQZGpV1h4
这里。这只是一个推送 ID,它是随机生成的。
我通过提供此引用进行了尝试:
geoFire = new GeoFire(firebaseDatabase.getReferenceFromUrl("https://appName-e1a35.firebaseio.com/requests/"));
然后将其与其他项目一起推送,如上图所示。但是,这仅保存了 GeoFire 坐标,而不是节点 requests
下的其他项目。
那么,我的 GeoFire 引用应该是什么,以便它与同一节点中的所有数据一起保存?
这里出了什么问题?请告诉我。
最佳答案
弗兰克的回答是正确的,但我想举个例子。 你的数据库结构应该是这样的。
{
"items" : {
<itemId> : {
"someData" : "someData",
...
}
},
"items_location" : {
<itemId> : {
<geofireData> ...
}
}
}
要获取数据,首先需要在 items_location
节点进行 GeoQuery,然后通过 onKeyEntered
方法获取数据。参数 key
是我的示例中的 itemId
。
geoFire = new GeoFire(FirebaseDatabase.getInstance().getReference().child("items_location");
geoQuery = geoFire.queryAtLocation(geoLocation), radius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
//retrieve data
}
};
希望这会有所帮助。
编辑 如何推送item并设置geofire数据。
String itemId = ref.child("items").push().getKey();
ref.child("items").child(itemId).setValue(item);
geoFire = new GeoFire(ref.child("items_location"));
geoFire.setLocation(itemId, new GeoLocation(lattitude, longitude));
编辑在一次 API 调用中保存项目数据和地理火灾数据
GeoHash geoHash = new GeoHash(new GeoLocation(latitude, longitude));
Map<String, Object> updates = new HashMap<>();
updates.put("items/" + itemId, item);
updates.put("items_location/" + itemId + "/g", geoHash.getGeoHashString());
updates.put("items_location/" + itemId + "/l", Arrays.asList(latitude, longitude));
ref.updateChildren(updates);
关于android - 如何将 GeoFire 坐标与 Firebase 数据库中的其他项目一起保存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38340949/