Firestore - 为什么检查DocumentSnapshot是否为空并且调用是否存在?

时间:2018-04-07 07:57:47

标签: java android firebase google-cloud-firestore

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方法会在内部检查无效。

4 个答案:

答案 0 :(得分:7)

成功完成的任务永远不会为null传递DocumentSnapshot。如果请求的文档不存在,您将获得一个空快照。这意味着:

  • 调用document.exists()返回false
  • 调用document.getData()会抛出异常

因此,在调用document != null之前,确实没有理由检查document.exists()

答案 1 :(得分:0)

如果执行以下语句:

document != null

它将被评估为false,这意味着您的tasknull,并且会打印出以下消息:

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)

如果documentSnapshotnullable,则应执行以下操作:

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();
  }