从Firestore
文档中查看此代码示例:
DocumentReference docRef = db.collection("cities").document("SF");
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document != null && document.exists()) {
Log.d(TAG, "DocumentSnapshot data: " + document.getData());
} else {
Log.d(TAG, "No such document");
}
} else {
Log.d(TAG, "get failed with ", task.getException());
}
}
});
https://firebase.google.com/docs/firestore/query-data/get-data
为什么检查document != null
?如果我正确地读取了源代码(初学者),exists
方法会在内部检查无效。
答案 0 :(得分:7)
成功完成的任务永远不会为null
传递DocumentSnapshot
。如果请求的文档不存在,您将获得一个空快照。这意味着:
document.exists()
返回false document.getData()
会抛出异常因此,在调用document != null
之前,确实没有理由检查document.exists()
。
答案 1 :(得分:0)
如果执行以下语句:
document != null
它将被评估为false
,这意味着您的task
为null
,并且会打印出以下消息:
Log.d(TAG, "No such document");
但是,如果您在task
对象上调用方法(例如toString()),则会抛出以下错误:
java.lang.IllegalStateException: This document doesn't exist. Use DocumentSnapshot.exists() to check whether the document exists before accessing its fields.
此消息明确告诉您使用exists()方法而不是检查无效。
关于使用how to get a document方法的官方文档说:
注意:如果 docRef 引用的位置没有文档,则生成的文档将为空。
答案 2 :(得分:0)
如果documentSnapshot
是nullable
,则应执行以下操作:
if (documentSnapshot != null) {
if (documentSnapshot.exists()) {
//exists
} else {
//doesn't exist
}
}
答案 3 :(得分:0)
另一种直接解决此类错误的方法是
DocumentSnapshot documentSnapshot = task.getResult();
assert documentSnapshot != null;
if (documentSnapshot.exists()) {
//Your operation e.g
ArrayList<String> obj= (ArrayList<String>) documentSnapshot.get("documentObject");
String s = Objects.requireNonNull(obj).toString();
Toast.makeText(context, "THIS WORKS "+ s, Toast.LENGTH_SHORT).show();
} else {
//Another operation
Toast.makeText(context, "DOES NOT EXIST", Toast.LENGTH_SHORT).show();
}