使用 geofire 和 firebase 根据距离检索用户列表
Retrieve a list of users based on distance with geofire & firebase
嘿,我已经看到了很多关于此的问题,但 none 似乎回答了我的特定问题。我正在尝试根据距离检索用户列表。我的 Firebase 数据库结构如下所示:
在 MainActivity
中,我会 运行 使用以下方法获得结果:
private List<User> generateProfiles(){
uidList = getUserList();
Log.d("UidList",String.valueOf(uidList.size()));
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference phoneNumberRef = rootRef.child("users");
phoneNumberRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
try{
User tempUser = ds.getValue(User.class);
userList.add(tempUser);
}
catch (IndexOutOfBoundsException e) {
Log.d("Index EXception", e.getMessage());
}
}
Log.d("PRIORUSER", userList.toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userList;
}
调用此方法获取geofire查询距离内的用户列表:
private List<String> getUserList(){
try{
mFusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
uidList.clear();
double lattitude = location.getLatitude();
double longitude = location.getLongitude();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("GeoFire");
GeoFire fire = new GeoFire(ref);
GeoQuery geoQuery = fire.queryAtLocation(new GeoLocation(lattitude,longitude),8);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
uidList.add(key);
uidList.remove(auth.getUid());
Log.d("UserUID",auth.getUid());
Log.d("List",uidList.toString());
}
@Override
public void onKeyExited(String key) {
uidList.remove(key);
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Log.d("GeoError",error.getMessage());
}
});
}
});
//asiudhauisdhuasuidas
}
catch(SecurityException e){
}
return uidList;
}
我在质疑我的设置是否正确,与用户相比有一个单独的 geofire 目录,以及 geofire 数据是否应该存储在每个单独的用户中。
我的问题是,如果我然后尝试循环遍历 UidList 以仅获取 geofire 查询中的 uid,我似乎得到一个 null return 或 return所有用户。
有人有可行的解决方案吗?结束状态我想要一个用户对象列表。
尝试以下操作:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("GeoFire");
ref.orderByChild("lattitude").equalTo(lattitude_here).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String userID=datas.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这里的快照在GeoFire
,然后你添加一个查询并迭代,以便能够根据查询的结果检索ids。
嘿,我已经看到了很多关于此的问题,但 none 似乎回答了我的特定问题。我正在尝试根据距离检索用户列表。我的 Firebase 数据库结构如下所示:
在 MainActivity
中,我会 运行 使用以下方法获得结果:
private List<User> generateProfiles(){
uidList = getUserList();
Log.d("UidList",String.valueOf(uidList.size()));
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference phoneNumberRef = rootRef.child("users");
phoneNumberRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
try{
User tempUser = ds.getValue(User.class);
userList.add(tempUser);
}
catch (IndexOutOfBoundsException e) {
Log.d("Index EXception", e.getMessage());
}
}
Log.d("PRIORUSER", userList.toString());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return userList;
}
调用此方法获取geofire查询距离内的用户列表:
private List<String> getUserList(){
try{
mFusedLocationClient.getLastLocation().addOnSuccessListener(this, new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
uidList.clear();
double lattitude = location.getLatitude();
double longitude = location.getLongitude();
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("GeoFire");
GeoFire fire = new GeoFire(ref);
GeoQuery geoQuery = fire.queryAtLocation(new GeoLocation(lattitude,longitude),8);
geoQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
@Override
public void onKeyEntered(String key, GeoLocation location) {
uidList.add(key);
uidList.remove(auth.getUid());
Log.d("UserUID",auth.getUid());
Log.d("List",uidList.toString());
}
@Override
public void onKeyExited(String key) {
uidList.remove(key);
}
@Override
public void onKeyMoved(String key, GeoLocation location) {
}
@Override
public void onGeoQueryReady() {
}
@Override
public void onGeoQueryError(DatabaseError error) {
Log.d("GeoError",error.getMessage());
}
});
}
});
//asiudhauisdhuasuidas
}
catch(SecurityException e){
}
return uidList;
}
我在质疑我的设置是否正确,与用户相比有一个单独的 geofire 目录,以及 geofire 数据是否应该存储在每个单独的用户中。
我的问题是,如果我然后尝试循环遍历 UidList 以仅获取 geofire 查询中的 uid,我似乎得到一个 null return 或 return所有用户。
有人有可行的解决方案吗?结束状态我想要一个用户对象列表。
尝试以下操作:
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("GeoFire");
ref.orderByChild("lattitude").equalTo(lattitude_here).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot datas: dataSnapshot.getChildren()){
String userID=datas.getKey();
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
这里的快照在GeoFire
,然后你添加一个查询并迭代,以便能够根据查询的结果检索ids。