2017-07-30 37 views
0

下面是我的代码。每个代码的作品,直到我过滤掉用户,当我检查用户是女性时,它只返回1个用户6次在我的数组和地图。我在swift中做了同样的事情,它工作得很好。在android中使用firebase和geofire获取数据

public void getNearby(GeoLocation location){ 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) { 

     } 
    }); 

} 

回答

0

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

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

希望它有帮助。

+0

这仍然不工作我唯一一次得到其他ID是在if(userKey.equals(userId)){ Log.v(“IDUser”,user.getUid()); (!userKey.equals(userId)){ } Log.v(“LogGeo”,user3.getUid()); 之后的任何点只显示一个ID。 – Rlee128

相关问题