首页 > 解决方案 > Data not being fetched from firestore database

问题描述

I have tried the below code to fetch code from my firestore database.The database structure is as shown: Database Structure All the documents from Devices collection needs to be fetched and displayed on application. But the toast above for loop is working and as soon as the code goes inside for loop it does not work.So the toast inside for loop not working and hence data is not being fetched. I tried all the methods we can use to fetch data,none of them working.Please provide me the solution. Thanks in advance.

public class CurrentStatusDevicesFragment extends Fragment {

    private static final String name = "title";
    private static final String type = "description";
    private TextView textViewData;
    private  String houseId;
    private String userId;
    private String data;
    FirebaseFirestore firebaseFirestore = FirebaseFirestore.getInstance();
    FirebaseAuth firebaseAuth=FirebaseAuth.getInstance();
    //DocumentReference dRef = firebaseFirestore.collection("Houses/").document(houseId);


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.device_profile, container, false);
        textViewData = (TextView) rootView.findViewById(R.id.textViewData);

        userId = firebaseAuth.getCurrentUser().getUid();
        firebaseFirestore.collection("Users")
                .document("userId").get()
                .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(Task<DocumentSnapshot> task) {
                        if (task.isSuccessful()) {
                            DocumentSnapshot document = task.getResult();
                            if (document.exists()) {
                                houseId = document.getString("HOUSE_ID");
                            } else {
                                Log.d("TAG", "No such document");
                            }
                        } else {
                            Log.d("TAG", "get failed with ", task.getException());
                        }
                    }
                });

        CollectionReference cRef = firebaseFirestore.collection("Devices");
        cRef.whereEqualTo("HOUSE_ID", houseId).addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
                if(e!=null){
                    Log.w("TAG","Listen Failed",e);
                    return;
                }
                data="";
                Toast.makeText(getContext(),"Hello",Toast.LENGTH_SHORT).show();
                for(QueryDocumentSnapshot document:queryDocumentSnapshots){
                    Toast.makeText(getContext(),"Bye",Toast.LENGTH_SHORT).show();
                    Device device = document.toObject(Device.class);
                    String name = device.getName();
                    String type = device.getType();
                    data+= "Name: "+name+"\nType of device: "+type;
                }
                textViewData.setText(data);
            }
        });
 });
        return rootView;
    }



//Device Class
package com.example.android.aide;

public class Device {
    private String NAME;
    private String TYPE;
    private String documentId;

    public Device(){}

    public String getDocumentId(){
        return documentId;
    }

    public void setDocumentId(String documentId){
        this.documentId = documentId;
    }

    public Device(String NAME, String TYPE){
        this.NAME = NAME;
        this.TYPE = TYPE;
    }

    public String getName() {
        return NAME;
    }

    public String getType() {
        return TYPE;
    }
}

device_profile.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/textViewData"
        android:layout_width="match_parent"
        android:textSize="30sp"
        android:layout_height="wrap_content" />

</LinearLayout>

`

标签: androidgoogle-cloud-firestore

解决方案


您正在使用异步检索的值添加侦听器。在您知道您拥有价值之后,您应该添加侦听器。

firebaseFirestore.collection("Users")
    .document("userId").get()
    .addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
        @Override
        public void onComplete(Task<DocumentSnapshot> task) {
            if (task.isSuccessful()) {
                DocumentSnapshot document = task.getResult();
                if (document.exists()) {
                    houseId = document.getString("HOUSE_ID");

                    // Now you can use the value of houseId
                    listenForHouseId();

                } else {
                    Log.d("TAG", "No such document");
                }
            } else {
                Log.d("TAG", "get failed with ", task.getException());
            }
        }
        });

将您的快照侦听器移动到一个函数:

public void listenForHouseId(){
    CollectionReference cRef = firebaseFirestore.collection("Devices");
    cRef.whereEqualTo("HOUSE_ID", houseId).addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
            if(e!=null){
                Log.w("TAG","Listen Failed",e);
                return;
            }
            data="";
            Toast.makeText(getContext(),"Hello",Toast.LENGTH_SHORT).show();
            for(QueryDocumentSnapshot document:queryDocumentSnapshots){
                Toast.makeText(getContext(),"Bye",Toast.LENGTH_SHORT).show();
                Device device = document.toObject(Device.class);
                String name = device.getName();
                String type = device.getType();
                data+= "Name: "+name+"\nType of device: "+type;
            }
            textViewData.setText(data);
        }
    });
}

推荐阅读