文件上说
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文档中看到的类型,不要向其他类型强制转换任何内容,除非您真的知道需要这样做。