Firestore - DocumentSnapshot 和 QueryDocumentSnapshot 之间的区别

问题描述 投票:0回答:2

文档说

QueryDocumentSnapshot 包含作为查询的一部分从 Firestore 数据库中的文档读取的数据。该文档保证存在,并且可以使用 getData() 或 get() 方法提取其数据。

QueryDocumentSnapshot 提供与 DocumentSnapshot 相同的 API 接口。由于查询结果只包含现有文档,exists() 方法将始终返回 true,而 getData() 永远不会为 null。

https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/QueryDocumentSnapshot

但它没有解释我什么时候应该使用其中一种而不是另一种。我在

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);
        }
    });
}
android firebase google-cloud-firestore
2个回答
30
投票

正如您所说:

QueryDocumentSnapshot 提供与 DocumentSnapshot 相同的 API 接口

这是因为QueryDocumentSnapshot是DocumentSnapshot的子类。这意味着每个QueryDocumentSnapshot都可以分配(向下转换)到DocumentSnapshot类型的变量。 他们做的事情完全相同,除了你所说的之间的区别:

由于查询结果只包含现有文档,exists() 方法将始终返回 true,并且 getData() 永远不会为 null。

因此,如果您正在处理 QueryDocumentSnapshot,则可以保证 contains() 方法将返回什么。 如果您正在处理DocumenSnapshot(实际上并不是被向下转换的QueryDocumentSnapshot),则您没有这种保证。

我认为您可能过于重视一个是另一个的子类这一事实。 只需使用您在 API 文档中看到的类型,不要将任何内容转换为其他类型,除非您确实知道需要这样做。


0
投票
  1. 当您使用您的 ID 获取单个集合时,请使用

    DocumentSnapshot

  2. 当您查询数据库中的多个文档/行时,您会得到一个

    QuerySnapshot
    。它就像 jdbc 返回的
    Resultset
    。您必须迭代快照并转换为您自己的对象,这里使用
    QueryDocumentSnapshot

    for(QueryDocumentSnapshot doc : snapshots){
      Note note = doc.toObject(Note.class);
    }
    
© www.soinside.com 2019 - 2024. All rights reserved.