在 android 中使用 firebase 和 geofire 获取数据

Getting data with firebase and geofire in android

下面是我的代码。每个代码都有效,直到我在检查用户是否为女性时过滤掉用户为止,它在我的数组和地图中仅 returns 1 个用户 6 次。我在 swift 中做了同样的事情,而且效果很好。

public void getNearby(GeoLocation 位置) { GeoLocation 中心 = new GeoLocation(location.latitude, location.longitude);

    final GeoQuery nearQuery = geoFire.queryAtLocation(center, 1.6);
    nearQuery.setRadius(1.6);
    nearQuery.addGeoQueryEventListener(new GeoQueryEventListener() {
        @Override
        public void onKeyEntered(String key, GeoLocation location) {
            String dbKey = key;
            if (dbKey != null) {
                profileRef.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(final DataSnapshot dataSnapshot) {
                        String userKey = dataSnapshot.getKey();
                        user3 = dataSnapshot.getValue(User3.class);
                        Log.v("Check", user3.toString());

                        if (userKey.equals(userId)) {
                            Log.v("IDUser", user.getUid());
                        } else if (!userKey.equals(userId)) {
                            Log.v("LogGeo", user3.getUid());


                            database.getReference().child("Blocked").child(userId).child(user3.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot snapshot) {
                                    if (snapshot.exists()) {
                                        Log.v("Snaps", "You blocked everyone!");
                                    } else {
                                         database.getReference().child("users").child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
                                             @Override
                                             public void onDataChange(DataSnapshot dataSnapshot) {
                                                 Map<String, String> cMap = (Map<String, String>) dataSnapshot.getValue();
                                                 String seeking = cMap.get("seeking");

                                                 if (seeking.equals("Woman")) {

                                                     database.getReference().child("users").child(user3.getUid()).addValueEventListener(new ValueEventListener() {
                                                         @Override
                                                         public void onDataChange(DataSnapshot snap) {
                                                             Map<String, String> map = (Map<String, String>) snap.getValue();

                                                             String gender = map.get("gender");
                                                             String age = map.get("age");
                                                             int ageN = Integer.parseInt(age);
                                                             int minAgeN = Integer.parseInt(minAge);
                                                             int maxAgeN = Integer.parseInt(maxAge);
                                                             if (gender.equals("Female")) {
                                                                 if ((ageN >= minAgeN) && (ageN <= maxAgeN)) {
                                                                     user3ArrayList.add(user3);


                                                                 }
                                                             }
                                                         }

                                                         @Override
                                                         public void onCancelled(DatabaseError databaseError) {

                                                         }
                                                     });
                                                 } else if (seeking.equals("Man")) {
                                                     database.getReference().child("users").child(user3.getUid()).addValueEventListener(new ValueEventListener() {
                                                         @Override
                                                         public void onDataChange(DataSnapshot dataSnapshot) {
                                                             Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
                                                             String gender = map.get("gender");
                                                             String age = map.get("age");
                                                             int ageN = Integer.parseInt(age);
                                                             int minAgeN = Integer.parseInt(minAge);
                                                             int maxAgeN = Integer.parseInt(maxAge);

                                                             if (gender.equals("Male")) {
                                                                 if ((ageN >= minAgeN) && (ageN <= maxAgeN)) {
                                                                     user3ArrayList.add(user3);

                                                                 }
                                                             }
                                                         }

                                                         @Override
                                                         public void onCancelled(DatabaseError databaseError) {

                                                         }
                                                     });
                                                 } else if (seeking.equals("Both")) {
                                                     database.getReference().child("users").child(user3.getUid()).addValueEventListener(new ValueEventListener() {
                                                         @Override
                                                         public void onDataChange(DataSnapshot dataSnapshot) {
                                                             Map<String, String> map = (Map<String, String>) dataSnapshot.getValue();
                                                             String age = map.get("age");
                                                             int ageN = Integer.parseInt(age);
                                                             int minAgeN = Integer.parseInt(minAge);
                                                             int maxAgeN = Integer.parseInt(maxAge);
                                                             if ((ageN >= minAgeN) && (ageN <= maxAgeN)) {
                                                                 user3ArrayList.add(user3);

                                                             }
                                                         }

                                                         @Override
                                                         public void onCancelled(DatabaseError databaseError) {

                                                         }
                                                     });
                                                 }
                                             }

                                             @Override
                                             public void onCancelled(DatabaseError databaseError) {

                                             }
                                         });
                                    }
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });

                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });

            }

        }

        @Override
        public void onKeyExited(String key) {

        }

        @Override
        public void onKeyMoved(String key, GeoLocation location) {

        }

        @Override
        public void onGeoQueryReady() {

        }

        @Override
        public void onGeoQueryError(DatabaseError error) {

        }
    });

}

这是因为您使用的是嵌套查询。 You are creating a new reference and you adding a new listener every time you iterate. 如果你得到 1 个用户 6 次,这意味着你在该节点中有 6 children 但返回结果只有一个,6 次。

为了解决这个问题,只需从第一个查询中取出第二个查询,您的问题就会得到解决。

希望对您有所帮助。