【问题标题】:Getting data with firebase and geofire in android在android中使用firebase和geofire获取数据
【发布时间】:2017-07-30 19:24:41
【问题描述】:

下面是我的代码。每个代码都有效,直到我检查用户是否为女性时过滤掉用户,它只在我的数组和地图中返回 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) {

        }
    });

}

【问题讨论】:

    标签: android firebase geofire


    【解决方案1】:

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

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

    希望对你有帮助。

    【讨论】:

    • 这仍然不起作用,我唯一获得其他 ID 的时间是 if (userKey.equals(userId)) { Log.v("IDUser", user.getUid()); } else if (!userKey.equals(userId)) { Log.v("LogGeo", user3.getUid());之后的任何一点都只显示一个 ID。
    猜你喜欢
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    • 2019-04-11
    • 2016-09-14
    • 2016-12-13
    • 2017-01-03
    • 1970-01-01
    • 2020-09-03
    相关资源
    最近更新 更多