如何在循环内获取Firebase的.addOnCompleteListener()方法?

时间:2019-03-07 07:39:18

标签: java android firebase firebase-realtime-database

首先,让我解释一下我要做什么。

我有一个类似“ 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成功或失败的消息的任务。

1 个答案:

答案 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();
                    }
                }
            });
}