在 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 次。
为了解决这个问题,只需从第一个查询中取出第二个查询,您的问题就会得到解决。
希望对您有所帮助。
下面是我的代码。每个代码都有效,直到我在检查用户是否为女性时过滤掉用户为止,它在我的数组和地图中仅 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 次。
为了解决这个问题,只需从第一个查询中取出第二个查询,您的问题就会得到解决。
希望对您有所帮助。