android - 如何将 GeoFire 坐标与 Firebase 数据库中的其他项目一起保存?

标签 android firebase firebase-realtime-database geofire

我正在开发一个应用程序并在 Firebase 数据库中保存一些字符串,例如 postedAtTimepostedBypostedOnDate。我想将 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);
}

以下是它在数据库中的保存方式:

database structure screenshot

我想要的是将 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/

相关文章:

swift - 在 Swift 4 中退出 Firebase

android - "No resource found that matches the given name..:"- Android Studio 2.1.2 (React Native App)

android - :app:transformClassesWithDexForDebug while compiling Firebase

android - 未找到 Android Studio 3.2 测试

Android源码git下载错误

firebase - 在android studio中添加firebase到flutter时出错: Plugin project :firebase_core_web not found. 请更新settings.gradle

android - Google 登录失败 com.google.android.gms.common.api.ApiException : 10:

firebase - 如何自定义firebase数据库的域名、身份验证和存储?

swift - Firebase 之类的系统无法正常工作

ios - Firebase 配置错误