public class MainActivity extends AppCompatActivity {
private static final String TAG = "100";
FirebaseFirestore db;
String checkCode;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
db= FirebaseFirestore.getInstance();
db.collection("Users")
.whereEqualTo("level", "admin")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
if (!queryDocumentSnapshots.isEmpty()) {
List<DocumentSnapshot> list = queryDocumentSnapshots.getDocuments();
for (DocumentSnapshot d : list) {
checkCode = (String) d.get("kode");
Toast.makeText(MainActivity.this, "From inside : "+checkCode, Toast.LENGTH_LONG).show();
}
}
}
});
Toast.makeText(MainActivity.this, "From outside : "+checkCode, Toast.LENGTH_LONG).show();
}
}
我仍然困惑如何从Cloud Firestore获取数据。 所以我尝试编写一个简单的代码从那里获取数据。我输入了1111代码。
运行程序后,内部的吐司给我:
From inside : 1111
但是外面的烤面包给了我
From outside : null
那是为什么? 以及我该如何解决?
答案 0 :(得分:1)
答案很简单,您全局声明了checkCode
变量,但是它没有任何值。因此它将是null
的值,并且该值在那里烘烤。但是当OnSuccessListener
执行其值时,将由代码checkCode = (String) d.get("kode");
分配,因此您将获得1111作为其值。
答案 1 :(得分:1)
onSuccess(QuerySnapshot queryDocumentSnapshots){}
中的代码是异步回调see this answer for an explanation,因为对Firebase的调用可能需要一些时间才能完成。
因此,Toast.makeText(MainActivity.this, "From outside : "+checkCode, Toast.LENGTH_LONG).show();
行将始终在回调之前执行。
答案 2 :(得分:1)
要将QuerySnapshot转换为对象列表,请使用:
querySnapshot.toObjects(YourObject.class)
因为向firebase的查询是异步的,所以在将值分配给checkCode之前会触发带有Tost FromOutside的行。这是FromOutside为null的原因。
答案 3 :(得分:1)
您正在异步调用Firestore。在OnSuccessListener
仍然为空的情况下显示Toast之后,检索数据时将调用onSuccess()
的{{1}}方法。您可以在checkCode
内移动烤面包,也可以只用onSuccess()
打印到控制台。