Вариант использования: У меня есть несколько заметок, каждая из которых привязана к ярлыку. Если пользователь удаляет метку, все заметки, связанные с этой меткой, привязываются к метке по умолчанию. Поэтому, чтобы это сработало, мне сначала нужно выяснить все заметки с этой меткой, заменить идентификатор метки идентификатором метки по умолчанию и, наконец, удалить выбранную метку. Все это должно быть Atom c и, следовательно, Firestore Transaction
.
Проблема возникает потому, что я хочу get()
несколько документов, запустив query
. Поскольку это операция async
, вся цель транзакции исчезает. Примеры, которые я видел в документации, относятся к одному документу.
FirebaseConstants.getRootRef() // db reference
.runTransaction((Transaction.Function<Void>) transaction -> {
FirebaseConstants.getNotesRef() // Notes collection reference
.whereEqualTo("labelDetails.id", "<old_label_id>")
.get()
.addOnSuccessListener(snapshots -> {
ArrayList<String> listIds = new ArrayList<>();
for (DocumentSnapshot snap : snapshots.getDocuments()) {
listIds.add(snap.getId());
}
for (String id : listIds) {
FirebaseConstants.getNotesRef()
.document(id)
.update("labelDetails.id", "<default_label_id>");
}
// Labels collection reference
FirebaseConstants.getLabelsRef().document("<old_label_id>").delete();
});
return null;
})
.addOnSuccessListener(snapshots -> {
Toast.makeText(this, "transaction success", Toast.LENGTH_SHORT).show();
})
.addOnFailureListener(e -> {
Toast.makeText(this, "transaction failed", Toast.LENGTH_SHORT).show();
});
Итак, мне бы очень хотелось узнать, как справиться с этим делом. Я знаю, что могу get()
сначала сопоставить идентификаторы, а затем выполнить транзакцию внутри get
OnSuccessListener
(или даже выполнить пакетную запись, поскольку get()
уже выполнена), но это не гарантирует согласованности данных. между get()
и моим update()
, не так ли?
Следовательно, мне интересно, как это должно быть сделано. Как get
и update
несколько документов, используя Transaction
?