首先,让我解释一下我要做什么。
我有一个类似“ 2019”的字符串日期,我需要在数据库中添加用户想要的n
次,并在循环中每年添加+1。
所以,我的问题是:我不知道如何获取.addOnCompleteListener()
,因为它在循环内,并且我不能只处理一个插入。我需要处理所有这些n
插入,以便在所有插入成功的情况下向用户提供反馈。
我的示例代码:
//This guarantee same UniqueID for all "n" inserts
final String UniqueID = getDatabaseReference().child("Example").push().getKey();
for (int i = 1 ; i <= n; i++){
getDatabaseReference()
.child("Example")
.child(getFirebaseAuthInstance().getCurrentUser().getUid())
.child(year)
.child(UniqueID)
.setValue(AnyData);
year = (Integer.parseInt(year)) + 1) ;
}
listener.success();
如果它不在循环中,我将这样处理:
getDatabaseReference()
.child("Example")
.child(getFirebaseAuthInstance().getCurrentUser().getUid())
.child(year)
.child(UniqueID)
.setValue(AnyData)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
listener.success();
}else {
listener.failure();
}
}
});
因此,我无法在上面执行此方法,因为循环将继续进行,而插入未完成,并且将使第一个成功,而其他循环则会失败。
如何处理循环?
我当时正在考虑创建一个List <Tasks> tasks
和一个Task task = getfirebase...
,tasks.add(task)
,但是我真的不知道如何使用它并处理所有导致OnComplete成功或失败的消息的任务。
答案 0 :(得分:0)
我认为您需要使用递归。创建一个用于更新的方法(尝试将数据库引用提取到外部,以免每次都查询不到)。 另外,您还需要知道更新的最大数量,我想这就是您的“ n”。
private static Integer UPDATE_COUNT = 0;
private static final String CHILD = "Example";
private final NotSureAboutType dbReference = getDatabaseReference();
private final SomeType uuid = getFirebaseAuthInstance().getCurrentUser().getUid();
final String UniqueID = getDatabaseReference().child("Example").push().getKey();
private void updateDB(final NotSureAboutType dbReference,
final SomeType uuid,
final String uniqueID,
final Object anyData,
final String year,
final Integer n) {
String tmpYear = year;
UPDATE_COUNT++;
dbReference
.child(CHILD)
.child(uuid)
.child(tmpYear)
.child(UniqueID)
.setValue(anyData)
.addOnCompleteListener(new OnCompleteListener<Void>() {
@Override
public void onComplete(@NonNull Task<Void> task) {
if (task.isSuccessful()){
listener.success(); // not sure what this does ?
if (UPDATE_COUNT <= n) {
updateDB(dbReference, uuid, uniqueID, anyData, (Integer.parseInt(tempyear) + 1), n);
}
}else {
listener.failure();
}
}
});
}