Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 嵌套Firebase查询_Android_Firebase_Asynchronous_Firebase Realtime Database - Fatal编程技术网

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").

我试图在另一个firebase查询(如嵌套for循环)中执行firebase查询,但外部查询在内部查询开始之前完全运行。我如何做到这一点?我是一个android和firebase的初学者

外部查询

 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) {

    }
});