gpt4 book ai didi

firebase - 在 GeoFire 节点下存储额外数据

转载 作者:行者123 更新时间:2023-12-02 21:40:31 27 4
gpt4 key购买 nike

我通过 GeoFire 将位置数据存储在我的数据库中,结构如下:

geofire
-Ke1uhoT3gpHR_VsehIv
-Kdrel2Z_xWI280XNfGg
-g: "dr5regw90s"
-l
-0: 40.7127837
-1: -74.00594130000002

建议将位置信息和 geofire 数据存储在单独的节点中,但是我发现在这些 geofire 节点下存储一些额外数据具有优势,例如企业名称。这样,我只需对 Firebase 进行一次调用即可获取附近的位置及其名称。

这可以通过 key_entered 方法实现吗?有没有人创建过类似的解决方案?即使位置信息不断更新,这真的是一个坏主意吗?

欢迎任何意见!

最佳答案

首先,您为应用程序使用的结构是错误的。

让我们以用户应用程序为例

当您使用 Geofire 时,您有两个数据列表:

a list of user details for each user
a list of latitude and longitude coordinates for each user

您正在尝试将两者存储在像这样的相同结构中

"users" : {
<userId> : {
"userData" : "userData",
<geofireData>
...
}
}

尝试将 userdata 和 geofiredata 存储在一个节点中是一个坏主意,因为您将大部分静态数据(用户的属性)与高度不稳定的数据(地理位置信息)混合在一起。将两者分开会导致更好的性能,这就是 Geofire 强制执行它的原因。

这就是为什么当您尝试将地理位置数据添加到用户节点时,它会覆盖该节点以前的用户详细信息。

你的数据库结构应该是这样的。

"Users" : {
<UserId> : {
"UserData" : "UserData",
...
}
}
"Users_location" : {
<UserId> : {
<geofireData> ...
}
}

因此,对于同一个用户 Id,您创建 2 个结构,一个用于用户详细信息,另一个用于该用户的地理位置详细信息。

如何推送用户并设置geofire数据。

String userId = ref.child("users").push().getKey();

ref.child("users").child(userId).setValue(user);

geoFire = new GeoFire(ref.child("user_location"));
geoFire.setLocation(userId, new GeoLocation(lattitude, longitude));

您在地理定位中使用的 userId 与您在 push() 过程中获得的 userId 相同。

因此,对于每个 userId,您在一个结构中拥有用户详细信息,在另一个结构中拥有位置详细信息。

要获取数据,首先需要在users_location节点执行GeoQuery,然后在onKeyEntered方法上获取数据。参数键是我示例中的 userId。

geoFire=newGeoFire(FirebaseDatabase.getInstance().getReference().child("users_location");
geoQuery = geoFire.queryAtLocation(geoLocation), radius);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
//retrieve data
//use this key which is userId to fetch user details from user details structure
}
};

祝你编码愉快:)

关于firebase - 在 GeoFire 节点下存储额外数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42608281/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com