如何获取Firestore集合中所有文档的名称(字段)?

时间:2019-08-24 18:03:45

标签: java android firebase google-cloud-firestore

我正在尝试向连接到Firestore数据库的第一个基本应用程序添加一个不错的功能,在那里获取集合中所有文档的名称,并将它们存储在字符串ArrayList中。如下所示,数据库非常简单,并且包含一个名为pedestals的集合,其中仅包含3个文档。每个文档都有4个字段(jack,jack_laser,名称和总和): Firestore snapshot of my database

通过使用pedestals.whereEqualTo(“ name”,true).get()我猜对所有名称的查询已初始化,但是我不确定如何从中提取名称。我观看了许多youtube视频,并尝试了用于Firestore的google code-lab部分,但它们每个都用于查询文档并存储其数据-虽然在这里我不想获取所有文档,但只希望获取其名称字段的值。

这是相关的方法代码:

 private void myFirsyQuary2(){
    // Get a reference to the pedestal collection
    final CollectionReference pedestals = mFirestore.collection("pedestals");

    // get all the names of the pedestals in firestore
    pedestals.whereEqualTo("name", true).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            for (QueryDocumentSnapshot document : task.getResult()) {
              //  names.add(document.getString("name"));
                  names.add(document.getData().toString());
            }
            String str = Arrays.toString(names.toArray());
            Log.e(TAG, "god job: " +str);
            Toast.makeText(FileLoading.this, "success!", Toast.LENGTH_LONG).show();
        }//end of onSuccess
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(FileLoading.this, "error!", Toast.LENGTH_LONG).show();
            Log.e(TAG, "could not get the query");
        }
    });

};

您可能会看到,我尝试实现一个for循环,该循环将每个文档快照(即使我正在查找字段而不是documentsm。这是问题吗?)存储在数组中。

在logcat终端中,我得到: 08-24 17:41:45.786 10738-10738 / benda.leveling_v2 E / MyActivity:上帝的工作:[] 这让我知道arraylist为空。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:0)

  

在这里,我不想获取所有文档,而只希望获取其名称字段的值。

无法从文档中仅获取name属性的值。在Coud Firestore中,没有字段级权限或对文档的访问。这是整个文档,或者什么也没有。 Firestore客户端SDK总是返回完整的文档。不幸的是,尽管服务器端SDK的select()方法中确实存在此选项,但无法通过客户端SDK仅请求文档的一部分。

此外,在使用以下代码行时:

pedestals.whereEqualTo("name", true)

这意味着您正在搜索pedestals集合中属性name拥有true值的每个文档。由于该属性包含一个String且 not 一个布尔值,因此没有可以返回的结果。可能的查询是:

pedestals.whereEqualTo("name", "site3")

它将在屏幕快照中返回第三个文档。如果要获取name属性或文档ID,请使用以下代码行:

pedestals.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            for (QueryDocumentSnapshot document : task.getResult()) {
                Log.d(TAG, document.getId() + " => " + document.getString("name"));
                Map<String, Object> map = document.getData();
            }
        }
    }
});

如果要获取这些数组,请注意,即使在数据库中那些属性为array类型,当您获取它们时,对象也为List类型。另一种解决方案可能是遍历map并获取相应的值。