代码之家  ›  专栏  ›  技术社区  ›  Oamar Kanji

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

  •  0
  • Oamar Kanji  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我有一个静态方法来获取集合中的所有文档。我在创建要返回的这些文档的数组时遇到问题。我怎么能做到?让我们称数组列表为“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;
        }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   OneCricketeer Gabriele Mariotti    6 年前

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

    使它成为最终的代码没有任何错误,并且考虑到代码,它不可能返回空值,但很可能是 空的 因为它实际上是在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
  •  1
  •   Hello World    6 年前

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