关于Firestore查询数据文档,特别是DocumentSnapshot

时间:2017-11-17 11:56:24

标签: android firebase google-cloud-firestore

Firestore query-data get-data文档中,我想知道document != null在什么情况下评估为false?不应该是!document.exists()

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) {
                Log.d(TAG, "DocumentSnapshot data: " + task.getResult().getData());
            } else {
                Log.d(TAG, "No such document");
            }
        } else {
            Log.d(TAG, "get failed with ", task.getException());
        }
    }
});

1 个答案:

答案 0 :(得分:2)

onComplete()回调提供Task<DocumentSnapshot>DocumentSnapshotnull个实例,并且此{{}}}的调用应该返回OnCompleteListener,而不是FirebaseFirestore.getInstance() .collection("this-does-not-exist") .document("neither-does-this") .get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() { @Override public void onComplete(@NonNull Task<DocumentSnapshot> task) { if (task.isSuccessful()) { if (task.getResult() == null) Log.d(TAG, "getResult is null"); Log.d(TAG, "getResult: " + task.getResult()); } } });

这引起了我的兴趣,所以我做了一些测试:我将task.getResult() == null附加到我知道不存在的文档中:

false

执行时,toString()检查评估为getResult(),因此消息&#34; getResult为空&#34;是写入日志。

但是,从java.lang.IllegalStateException: This document doesn't exist. Use DocumentSnapshot.exists() to check whether the document exists before accessing its fields. 返回时调用exists()会引发以下错误:

exists()

这明确指出使用Task而不是空检查,但getResult()说:

  

注意:如果 docRef 引用的位置没有文档,则生成的文档将为空。

此外,同一文档页面上的其他语言示例均使用DocumentReference docRef = db.collection("cities").document("SF"); // asynchronously retrieve the document ApiFuture<DocumentSnapshot> future = docRef.get(); // ... // future.get() blocks on response DocumentSnapshot document = future.get(); if (document.exists()) { System.out.println("Document data: " + document.getData()); } else { System.out.println("No such document!"); } ,但Android和Objective-C除外。最重要的是:Java示例使用document.exists()

document != null

在这种情况下,我谨慎地认为这似乎是文档中的错误,我们应该使用#!/bin/bash sh /your_path/bin/elasticsearch 而不是pm2 start ES_service.sh --name=elasticsearch