Android 嵌套Firebase查询
我试图在另一个firebase查询(如嵌套for循环)中执行firebase查询,但外部查询在内部查询开始之前完全运行。我如何做到这一点?我是一个android和firebase的初学者 外部查询Android 嵌套Firebase查询,android,firebase,asynchronous,firebase-realtime-database,Android,Firebase,Asynchronous,Firebase Realtime Database,我试图在另一个firebase查询(如嵌套for循环)中执行firebase查询,但外部查询在内部查询开始之前完全运行。我如何做到这一点?我是一个android和firebase的初学者 外部查询 private void retrieveMarkerDetails(final String key) { databaseReference = mDatabase.getReference(); databaseReference.child("Parking Lots").
private void retrieveMarkerDetails(final String key) {
databaseReference = mDatabase.getReference();
databaseReference.child("Parking Lots").child(key).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
parking_lot_details = dataSnapshot.getValue(Parking_Lot_Details.class);
Marker marker;
if (markers.size() != 0) {
marker = markers.get(key);
String title = parking_lot_details.getLotName();
//Calculate Remaining space
spaceAvailable();
Log.i(“可用剩余空间”,String.valueOf(parking\u lot\u details.getAvailableSpace())
内部查询
这是应该运行的内部查询
private void spaceAvailable() {
spaceAvailable = new int[1];
//Strip email of dots and use it to access requests, since the requests use the emails
//of lot owners as keys
String lot_email= parking_lot_details.getEmail().replace(".","");
Log.i("lot_email",lot_email);
databaseReference.child("Requests").child(lot_email).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
long requestsMade = dataSnapshot.getChildrenCount();
Log.i("Requests ", dataSnapshot.toString());
Log.i("RequestsMade", Long.toString(requestsMade));
spaceAvailable[0] = (int) (Integer.parseInt(parking_lot_details.getCapacity()) - requestsMade);
parking_lot_details.setAvailableSpace(String.valueOf(spaceAvailable[0]));
Log.i("Space Available ", String.valueOf(spaceAvailable[0]));
Log.i("Space Available in met ", parking_lot_details.getAvailableSpace());
}else{
//if the email does not appear under requests then we assume that no requests have
//been made and the available space is equal to the lots capacity
parking_lot_details.setAvailableSpace(parking_lot_details.getCapacity());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
数据库
日志
为了使其正常工作,请更改第二个查询,如下所示:
databaseReference.child("Requests").child(lot_email).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
long requestsMade = dataSnapshot.getChildrenCount();
Log.d("TAG", dataSnapshot.getKey() + " / No. of childrens: " + requestsMade);
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long childRequestsMade = ds.getChildrenCount();
String lot_email = ds.child("lot_email").getValue(String.class);
Log.d("TAG", lot_email);
}
}else{
//if the email does not appear under requests then we assume that no requests have
//been made and the available space is equal to the lots capacity
parking_lot_details.setAvailableSpace(parking_lot_details.getCapacity());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
要显示这些子项中的值,需要使用for循环并使用
getChildren()
方法。在本例中,它将只打印lot\u email
,因此您说第一个查询首先运行,第二个查询第二次运行?是的,第一个查询在第二个查询之前完全运行,因此我在哪一行得到空值?请添加整个错误,以便看得更清楚。更新了代码这行代码,工作正常吗<代码>Log.i(“批次电子邮件”,批次电子邮件)代码>返回用户电子邮件?感谢您的帮助,但我想获取ChildrenCount()而不是getChildren(),您仍然可以获取它。请看我更新的答案。我为两个dataSnapshot
对象都添加了。它有效吗?什么是null
?在哪一行获取null
?所有电子邮件都会被记录,这意味着代码会运行外部查询,直到耗尽所有节点,然后再运行内部查询,在外部查询完成更改后也会运行addValueEventListener
和addListenerForSingleValueEvent
。现在应该可以工作了。对吗?
databaseReference.child("Requests").child(lot_email).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
long requestsMade = dataSnapshot.getChildrenCount();
Log.d("TAG", dataSnapshot.getKey() + " / No. of childrens: " + requestsMade);
for(DataSnapshot ds : dataSnapshot.getChildren()) {
long childRequestsMade = ds.getChildrenCount();
String lot_email = ds.child("lot_email").getValue(String.class);
Log.d("TAG", lot_email);
}
}else{
//if the email does not appear under requests then we assume that no requests have
//been made and the available space is equal to the lots capacity
parking_lot_details.setAvailableSpace(parking_lot_details.getCapacity());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});