我有一个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:
循环的另一个逻辑也给出相同的错误。
登录时,我可以看到doc
和ds.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));
}
}
}
}
});
答案 0 :(得分:4)
在DocumentReference对象上调用.get()
时,您将返回一个Task<DocumentSnapshot>
对象。
有没有一种方法可以使用列表来获取多个文档及其字段值。
是的。解决此问题的关键是whenAllSuccess(Collection<? extends Task<?>> 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()
的吸气剂,则日志中的结果将是所有家庭成员的全部姓名。