根据Geofire和Firebase的距离检索用户列表

时间:2018-07-05 05:43:05

标签: java android firebase firebase-realtime-database geofire

嘿,我已经看到了很多与此有关的问题,但似乎没有一个问题可以回答我的特定问题。我正在尝试根据用户距离检索用户列表。我的Firebase数据库结构如下:

enter image description here

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返回或所有用户返回。

有人有可行的解决方案吗?结束状态,我想要一个用户对象列表。

1 个答案:

答案 0 :(得分:0)

尝试以下操作:

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,然后添加查询并进行迭代以根据查询结果检索ID。