android - 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>
`
解决方案
您正在使用异步检索的值添加侦听器。在您知道您拥有价值之后,您应该添加侦听器。
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);
}
});
}
推荐阅读
- python - 如何从 ABC 和另一个类继承
- javascript - 尝试访问脚本时使用useEffect在我的React项目上获取“TypeError:无法读取null的属性'classList'”?
- javascript - DiscordJS:仅替换 JSON 的特定部分
- macos - 错误:无法“发布升级”颤振工具。5 秒后重试...(还剩 9 次尝试)
- java - Java 获取 Arraylist 中某些元素的平均值
- r - UseMethod 常见任务所有 S3 类
- readline - 想检查 IF File.Exists 来定义 StreamReader,然后搜索特定的行
- sql - 通过 ODBC 将 R 连接到雪花
- python - 如何在保持索引结构的同时对多索引中的值进行排序
- javafx - hbox 中的 JavaFX 布局问题