文档说
QueryDocumentSnapshot 包含作为查询的一部分从 Firestore 数据库中的文档读取的数据。该文档保证存在,并且可以使用 getData() 或 get() 方法提取其数据。
QueryDocumentSnapshot 提供与 DocumentSnapshot 相同的 API 接口。由于查询结果只包含现有文档,exists() 方法将始终返回 true,而 getData() 永远不会为 null。
但它没有解释我什么时候应该使用其中一种而不是另一种。我在
SnapshotListener
和 Collection
上都尝试过,都成功了。
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都可以分配(向下转换)到DocumentSnapshot类型的变量。 他们做的事情完全相同,除了你所说的之间的区别:
由于查询结果只包含现有文档,exists() 方法将始终返回 true,并且 getData() 永远不会为 null。
因此,如果您正在处理 QueryDocumentSnapshot,则可以保证 contains() 方法将返回什么。 如果您正在处理DocumenSnapshot(实际上并不是被向下转换的QueryDocumentSnapshot),则您没有这种保证。
我认为您可能过于重视一个是另一个的子类这一事实。 只需使用您在 API 文档中看到的类型,不要将任何内容转换为其他类型,除非您确实知道需要这样做。
当您使用您的 ID 获取单个集合时,请使用
DocumentSnapshot
。
当您查询数据库中的多个文档/行时,您会得到一个
QuerySnapshot
。它就像 jdbc 返回的 Resultset
。您必须迭代快照并转换为您自己的对象,这里使用 QueryDocumentSnapshot
。
for(QueryDocumentSnapshot doc : snapshots){
Note note = doc.toObject(Note.class);
}