gpt4 book ai didi

android - 使用任务从 Firestore 中多次读取文档引用

转载 作者:行者123 更新时间:2023-11-29 23:03:51 25 4
gpt4 key购买 nike

我有一个从 Firestore 读取的引用 map 。这些 refs 引导我找到我愿意使用他们的数据来创建我的类“联系人”的实例的文档。

为了做到这一点,我创建了一个任务列表,其中的每个任务都使用其 ref 从 Firestore 读取并检索所需的数据。

一旦完成,我将使用 Tasks.whenAll(tasks).addOnSuccessListener() 来检索我的新联系人数组。

在这个方法中,'contacts' 是空的,'data' 充满了文档引用。我希望 Tasks.whenAll(tasks) 只有在使用 refs 完成所有这些读取时才会被调用,但是它会立即被调用,因此 - 没有任何反应。

private void createContactArray(final ArrayList<Contact> contacts, final Map<String, DocumentReference> data) {
List<Task<DocumentSnapshot>> tasks = new ArrayList<>();
for (final Map.Entry<String, DocumentReference> entry : data.entrySet()) {
tasks.add(db.document(entry.getValue().getPath()).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Map<String,String> contactDetails = (Map<String, String>) document.getData().get(entry.getKey());
Contact contact = createContact(contactDetails);
if(contact != null){ contacts.add(contact);}

} else {
Log.d(ACTION_FETCH_CONTACT_LIST,"There was ref problem with " + entry.getKey());
}
}else {
Log.d(ACTION_FETCH_CONTACT_LIST, "get failed with ", task.getException());
}
}
}));
}
Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
@Override
public void onSuccess(Void aVoid) {
sendBroadcastActionContactList(contacts);
}
});

我希望 Tasks.whenAll 在全部完成后被调用,而不是立即调用。我希望对这个问题有一个正确的解释,并希望有一个像样的代码来代替我的工作。

非常感谢您的帮助!

最佳答案

您未正确使用 API。您应该将 get() 返回的任务收集到一个数组中,而不是立即为每个任务添加一个回调。将该任务列表传递给 Tasks.whenAll()。然后,在 Tasks.whenAll 返回的任务回调中,您可以检查每个 DocumentSnapshot 结果。

关于android - 使用任务从 Firestore 中多次读取文档引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56725314/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com