【问题标题】:Retrieve a list of users based on distance with geofire & firebase使用 geofire 和 firebase 根据距离检索用户列表
【发布时间】:2018-12-13 12:14:12
【问题描述】:

大家好,我已经看到了很多关于此的问题,但似乎没有一个可以回答我的特定问题。我正在尝试根据他们的距离检索用户列表。我的 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,我似乎会得到空返回或所有用户的返回。

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

【问题讨论】:

  • 您不能将userList 对象作为方法的结果返回,因为它始终是null。请检查副本以了解您为什么会出现这种行为以及如何使用自定义回调来解决此问题。
  • Alex,我从 userList 得到一个结果,问题是我得到了所有用户,而不仅仅是 UidList 中的用户。我认为你没有理解这个问题。我使用 getUserList() 方法中的 GeoFire 查询返回一个 用户列表(成功)。需要将此 uidList 传递给 generateProfiles() 方法(成功)然后我需要遍历此列表并从 Firebase 数据库引用“用户”中检索 User.class
  • 您仅在onDataChange() 内部从userList 获得结果,但是当您返回它时,它是null

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


【解决方案1】:

尝试以下方法:

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。

【讨论】:

    猜你喜欢
    • 2016-09-14
    • 2016-11-29
    • 2016-10-12
    • 2020-05-06
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多