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

时间:2018-11-26 04:28:50

标签: android firebase google-cloud-firestore

我有一个静态方法来获取集合中的所有文档。我在创建要返回的这些文档数组时遇到了麻烦。我该怎么办?让我们将数组列表称为“ allItems”。我的方法是将在for循环中创建的每个项目添加到allItems数组列表中,但是当我返回该列表并且android studio提示我将数组列表定为最终列表时,该列表为null。

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;
    }

2 个答案:

答案 0 :(得分:1)

我用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")
}

答案 1 :(得分:1)

  

但是此列表在我返回时为空,并且android studio提示我将数组列表定为最终列表。

使它最终定好没有任何问题,并且给出该代码后,它不可能返回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适配器,例如