作者:没有结果的爱请你收好 | 来源:互联网 | 2023-02-09 21:16
我通过GeoFire在我的数据库中存储位置数据,这里是结构:
geofire
-Ke1uhoT3gpHR_VsehIv
-Kdrel2Z_xWI280XNfGg
-g: "dr5regw90s"
-l
-0: 40.7127837
-1: -74.00594130000002
它可以将位置的信息和地理数据存储在不同的节点中,但我认为在这些地理空间节点下存储一些额外的数据是有利的,例如企业的名称.通过这种方式,我只需拨打一次电话即可访问我的Firebase,以获取附近的位置及其名称.
这可以通过这种key_entered
方法实现吗?有人创建过类似的解决方案吗?即使位置信息一直在更新,这真的是一个想法吗?
任何输入都表示赞赏!
1> 小智..:
首先,您为应用程序使用的结构是错误的.
让我们举一个用户应用程序的例子
使用Geofire时,您有两个数据列表:
a list of user details for each user
a list of latitude and longitude coordinates for each user
您试图将两者存储在这样的相同结构中
"users" : {
: {
"userData" : "userData",
...
}
}
尝试将userdata和geofiredata存储在一个节点中是一个坏主意,因为您将大部分静态数据(用户的属性)与高度易变的数据(地理位置信息)混合在一起.将两者分开可以提高性能,这就是Geofire强制执行的原因.
这就是为什么当您尝试将地理位置数据添加到用户节点时,它会覆盖该节点的先前用户详细信息.
您的数据库结构应该是这样的.
"Users" : {
: {
"UserData" : "UserData",
...
}
}
"Users_location" : {
: {
...
}
}
因此,对于相同的用户ID,您可以为用户详细信息创建一个结构,另一个用于该用户的地理定位详细信息.
如何推送用户并设置地理位置数据.
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,您在anotehr结构中的一个结构和位置详细信息中都有用户详细信息.
要获取数据,首先需要在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
}
};
快乐编码:)