文件上说
querydocumentsnapshot包含作为查询的一部分从firestore数据库中的文档读取的数据。保证文档存在,并且可以使用getData()或get()方法提取其数据。
querydocumentsnapshot提供与documentsnapshot相同的api表面。由于查询结果只包含现有文档,exists()方法将始终返回true,getData()将永远不为空。
https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/QueryDocumentSnapshot
但这不能解释我什么时候该用一个而不是另一个。我在aSnapshotListener和aCollection中都试过了,都试过了。

protected void onStart() {
    super.onStart();
    notebookRef.addSnapshotListener(new EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
            if (e != null) {
                Toast.makeText(MainActivity.this, "Error while loading!", Toast.LENGTH_SHORT).show();
                Log.d(TAG, e.toString());
                return;
            }

            String allNotes = "";

            for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {


                Note note = documentSnapshot.toObject(Note.class);

                String title = note.getTitle();
                String description = note.getDescription();

                allNotes += "\nTitle: " + title + " Description: " + description;

            }

            textViewData.setText(allNotes);
        }
    });
}

最佳答案

正如你所说:
querydocumentsnapshot提供与documentsnapshot相同的api表面
这是因为QueryDocumentSnapshot是documentsnapshot的一个子类。这意味着每个querydocumentsnapshot都可以分配(downcast)给documentsnapshot类型的变量。他们做的是完全相同的事情,除了你所说的他们之间的区别:
由于查询结果只包含现有文档,exists()方法将始终返回true,getData()将永远不为空。
因此,如果处理的是querydocumentsnapshot,那么可以保证exists()方法将返回什么。如果您正在处理一个documensnapshot(实际上这不是一个被下传的querydocumentsnapshot),那么您没有这个保证。
我认为你可能过于强调一个是另一个的子类。只需使用在api文档中看到的类型,不要向其他类型强制转换任何内容,除非您真的知道需要这样做。

10-06 07:21