【问题标题】:Java, Firestore - Get multiple documents from firestore using an arraylist of document ids in android studioJava,Firestore - 使用 android studio 中的文档 ID 数组列表从 firestore 获取多个文档
【发布时间】:2020-09-02 04:41:10
【问题描述】:

我有一个 ArrayList,其中包含我想要获取的所有 id。有没有办法可以使用列表获取多个文档及其字段值。另外,如果我必须手动创建一个 for 循环来获取每个文档,我该怎么做?

Firestore 数据结构:

Users:
  user1:
     field1 :
     field2 :
     field3 :
     field4 :
  user2:
     field1 :
     field2 :
     field3 :
     field4 :
  user3:
     field1 :
     field2 :
     field3 :
     field4 :

列表包含:user1,user2,user3 等等...

编辑 1: 我尝试使用 for 循环来获取它,但它给出了一个空指针异常 在FriendsData.add(userDetails);

 for (String doc : list_of_Friends) {
                    FirebaseFirestore.getInstance().collection("Users").document(doc).get()
                            .addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
                                @Override
                                public void onSuccess(DocumentSnapshot documentSnapshot) {
                                    FamilyMember userDetails = documentSnapshot.toObject(FamilyMember.class);
                                    FriendsData.add(userDetails);
                                }
                            });

编辑 2:

循环的另一个逻辑也给出了同样的错误。 当我登录时,我可以看到 docds.getId() 都在获取值

FirebaseFirestore.getInstance().collection("Users").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                            if(task.isSuccessful())
                            for (DocumentSnapshot ds : task.getResult()){
                                for (String doc : list_of_Friends) {
                                    if(ds.getId().equals(doc)){
                                        FriendsData.add(ds.toObject(FamilyMember.class));
                                    }
                                }

                            }
                        }
                    });

【问题讨论】:

  • 您尝试了哪些方法来检索文档?
  • 我尝试使用 for 循环逐个添加每个文档,但它给出了空指针异常
  • 所有文档是否都有相似的属性/字段?
  • 是的,它们的字段数相同。
  • 我已经更新了我对循环所做的更改。请检查

标签: java android firebase google-cloud-firestore


【解决方案1】:

当您在 DocumentReference 对象上调用 .get() 时,您将返回一个 Task&lt;DocumentSnapshot&gt; 对象。

有没有一种方法可以使用列表获取多个文档及其字段值。

是的,是的。解决这个问题的关键是whenAllSuccess(Collection&lt;? extends Task&lt;?&gt;&gt; tasks)方法。在您的特定情况下,代码应如下所示:

List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
for (String doc : list_of_Friends) {
    tasks.add(FirebaseFirestore.getInstance().collection("Users").document(doc).get());
}

Tasks.whenAllSuccess(tasks).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
        //Do what you need to do with your list
        for (Object object : list) {
            FamilyMember fm = ((DocumentSnapshot) object).toObject(FamilyMember.class);
            Log.d("TAG", fm.getName());
        }
    }
});

假设您的 FamilyMember 类中有一个名为 name 的属性和一个名为 getName() 的 getter,那么您的 logcat 中的结果将是所有家庭成员的姓名。

【讨论】:

  • 没想到会得到您的答复。大快人心。您的回答也对我早有帮助。
猜你喜欢
  • 2020-09-07
  • 2018-09-03
  • 1970-01-01
  • 1970-01-01
  • 2020-12-03
  • 2021-07-20
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多