如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]

Posted

技术标签:

【中文标题】如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]【英文标题】:How to get all documents from a firestore collection and return them in an array list? [duplicate] 【发布时间】:2019-04-27 17:23:52 【问题描述】:

我有一个静态方法可以获取集合中的所有文档。我无法创建要返回的这些文档的数组。我怎么能那样做?让我们将数组列表称为“allItems”。我的方法是将在 for 循环中创建的每个项目添加到 allItems 数组列表中,但是当我返回它并且 android studio 提示我将数组列表设为最终列表时,该列表为空。

public static ArrayList<Item> geAllFromFireStore() 

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        ArrayList<Item> allItems = new ArrayList<>();

        db.collection("Items")
                .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.getData());

                                String name = document.get("name") + "";
                                String categoryName = document.get("category") + "";

                                Item item = new Item(name, category);

                                // I would like to add these items to an array list and return that array list

                            
                         else 
                            Log.w(TAG, "Error getting documents.", task.getException());
                        
                    
                );

        return allItems;
    

【问题讨论】:

检查一下。 ***.com/questions/48594059/… 这将向调用方法返回一个空列表,仅供参考 【参考方案1】:

但是当我返回这个列表时它是空的,并且 android studio 提示我将数组列表设置为最终列表。

将其设为 final 并没有错,鉴于该代码,它不可能返回 null,但很可能是 empty,因为它实际上是在 Firebase 甚至尝试制作遥控器之前返回的数据库查询。

这就是异步的问题——您需要等待结果才能返回它。

例如参数化获取快照的监听器

public static void getAllFromFireStore(OnCompleteListener<QuerySnapshot> listener) 
    FirebaseFirestore db = FirebaseFirestore.getInstance();
    db.collection("Items").get().addOnCompleteListener(listener);
 

就是这样。

从那里,重构其余代码以传入您已经编写的侦听器,而不是实际期望从方法调用中返回一个对象

API.getAllFromFireStore(new OnCompleteListener<QuerySnapshot>() 
    @Override 
    public void onComplete(@NonNull Task<QuerySnapshot> task) 
        if (task.isSuccessful()) 
            // TODO: get data 
         
);

从里面,你可以填充一个 RecyclerView 适配器,例如

【讨论】:

【参考方案2】:

我是用 Kotlin 编写的,所以请在你的代码中修改它。

// Declare variable that use to collect DocumentSnapshot
private lateinit var list: MutableList<DocumentSnapshot>

// In addOnCompleteListener…
if(task.isSuccessful)
    lstMAP = mutableListOf<DocumentSnapshot>()
    lstMAP.clear()
    lstMAP.addAll(task.result!!.documents)
 else 
    Log.d("doc", "0 doc")

【讨论】:

谢谢,不过我无法理解这一点。这将如何让我返回包含文档的数组列表? 我已经编辑了我的代码,所以请再次检查。如果你仍然使用 for-loop,那么在 for-loop 之后返回它。 顺便说一下,使用 allItems 时请小心。因为如果您的 Collection 没有文档,当您从空 arrayList 获取值时,它可能会导致 IndexOutOfBoundsException。 如果有效,请接受我的回答。 谢谢,我已经忘记他的代码已经有return语句了。

以上是关于如何从 Firestore 集合中获取所有文档并将它们返回到数组列表中? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

从 Firestore 的一个集合中获取所有文档

Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?

Firestore - 如何在将文档添加到集合后获取文档 ID

引用了 Firestore 如何从另一个集合文档 id 中获取集合值

从 id 数组中获取 firestore 文档列表

我可以获取从 Firestore 集合组查询中获取的文档的路径或引用吗?