Получение данных с помощью firebase и geofire в android

Ниже мой код. Каждый код работает до тех пор, пока я не перейду к фильтрации пользователей, когда я проверяю, являются ли пользователи женщинами, он возвращает только 1 пользователя 6 раз в моем массиве и на карте. Я сделал то же самое в Swift, и он отлично работает.

public void getNearby (местоположение GeoLocation) {GeoLocation center = 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) {

        }
    });

}

person Rlee128    schedule 30.07.2017    source источник


Ответы (1)


Это происходит из-за того, что вы используете вложенные запросы. You are creating a new reference and you adding a new listener every time you iterate. Если вы получаете 1 пользователя 6 раз, это означает, что у вас 6 дочерних узлов в этом узле, но возвращаемый результат - только один, 6 раз.

Чтобы решить эту проблему, просто получите второй запрос из первого, и ваша проблема будет решена.

Надеюсь, поможет.

person Alex Mamo    schedule 31.07.2017
comment
Это все еще не работает, когда я получаю другие идентификаторы, если (userKey.equals (userId)) {Log.v (IDUser, user.getUid ()); } иначе, если (! userKey.equals (userId)) {Log.v (LogGeo, user3.getUid ()); в любой момент после него отображается только один идентификатор. - person Rlee128; 01.08.2017