我正在开发一个应用程序,并保存一些字符串,如postedAtTime,postedBy,postOnDate在Firebase
Database中.我想将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,postedAtTime,postedOnDate,userEmail,geoFire); databaseReferenceHRequests.push().setValue(hRequest); }
我想要的是,我想在同一个节点中保存GeoFire坐标,这里是-KLIoLUsI0SpQZGpV1h4.这只是一个推送ID,它会随机生成.
我尝试通过给出这个参考:geoFire = new GeoFire(firebaseDatabase.getReferenceFromUrl(“https://appName-e1a35.firebaseio.com/requests/”));然后用如上所示的其他项目推动它.但是,这只保存了GeoFire坐标,而不是节点下的其他项目:请求.
那么,我的GeoFire应该是什么引用,以便与同一节点中的所有数据一起保存?
这里出了什么问题?请告诉我.
解决方法
弗兰克的答案是正确的,但我想举个例子.
你的数据库结构应该是这样的.
你的数据库结构应该是这样的.
"items" : { <itemId> : { "someData" : "someData",... } } "items_location" : { <itemId> : { <geofireData> ... } }
要获取数据,首先需要在items_location节点执行GeoQuery,然后通过onKeyEntered方法获取数据.参数键是我的例子中的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 } };
希望这可以帮助.
编辑
如何推送项目并设置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));
EDIT在一个API调用中保存项目数据和geofire数据
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);