前一个完成后,如何设置新的Firestore获取侦听器

时间:2018-06-19 13:19:03

标签: android google-cloud-firestore

在我的Firestore数据库中,我有一个像这样的数据结构: 单元> 1-15单元>单词>单词文档

我想得到每个单元中的单词。 我想从x-1单元中完全检索到单词后再获得x单元中的单词

我考虑过要创建一种从特定单元获取单词并在完成后返回true的方法,因此在主程序中,我可以检查该方法是否返回true,可以从下一个单元获取单词。 / p>

我尝试使用onSuccessListener / onCompleteListener,但无济于事

我是这样说的:(很好)

        String mainCollection = "Units";
    String document = "Unit " + unitNumber;
    String subCollection = "Words";

        CollectionReference docRef = firebaseFirestore.collection(mainCollection)
                .document(document).collection(subCollection);

        docRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) {
                        Word currentWord = queryDocumentSnapshot.toObject(Word.class);
                        wordsDatabase.wordDao().insertAWord(currentWord); //Inserts the words to Room database table
                    }

                }
            }
        });
每个单词集合中的

超过500个文档,因此可能会花费一些时间来建立较弱的Internet连接

1 个答案:

答案 0 :(得分:0)

通常,您可以通过声明一个调用自身的函数来做到这一点:

int unitNumber = 1;
String mainCollection = "Units";
String document = "Unit " + unitNumber;
String subCollection = "Words";

getWordsFor(1);

public void getWordsFor(int unitNumber) {
    CollectionReference docRef = firebaseFirestore.collection(mainCollection)
            .document(document).collection(subCollection);

    docRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
        @Override
        public void onComplete(@NonNull Task<QuerySnapshot> task) {
            if (task.isSuccessful()) {
                for (QueryDocumentSnapshot queryDocumentSnapshot : task.getResult()) {
                    Word currentWord = queryDocumentSnapshot.toObject(Word.class);
                    wordsDatabase.wordDao().insertAWord(currentWord); //Inserts the words to Room database table
                }

                // if there are more units to read, kick off the next one
                if (unitNumber < 15) {
                    getWordsFor(unitNumber+1);
                }
            }
        }
    });
}

因此,我们以getWordsFor(1)开始,然后在完成读取之后,该函数检查是否还有更多工作要做,如果是这种情况,则重新调用自身。