Firestore - 在本地合并两个查询

由于Firestore中没有逻辑运算符,因此我尝试在本地合并2个单独的查询。OR

现在我想知道如何保持结果的正确顺序。当我独立运行2个查询时,我无法具体地描述结果(至少不是我使用该方法从Firestore获得结果的顺序)。orderBy

我的想法是将第二个查询放在第一个查询中。这是性能方面的坏主意吗?onSuccessListener

public void loadNotes(View v) {
    collectionRef.whereLessThan("priority", 2)
            .orderBy("priority")
            .get()
            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                @Override
                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                        Note note = documentSnapshot.toObject(Note.class);
                        //adding the results to a List
                    }

                    collectionRef.whereGreaterThan("priority", 2)
                            .orderBy("priority")
                            .get()
                            .addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
                                @Override
                                public void onSuccess(QuerySnapshot queryDocumentSnapshots) {

                                    for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
                                        Note note = documentSnapshot.toObject(Note.class);
                                        //adding the results to a List
                                    }
                                }
                            });
                }
            });
}

答案 1

若要在本地合并 2 个单独的查询,我建议您使用方法。您可以使用以下代码行实现此目的:Tasks.whenAllSuccess()

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
Query firstQuery = rootRef...
Query secondQuery = rootRef...

Task firstTask = firstQuery.get();
Task secondTask = secondQuery.get();

Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
    @Override
    public void onSuccess(List<Object> list) {
         //Do what you need to do with your list
    }
});

如您所见,当重写该方法时,结果是对象的结果,该对象具有作为参数传递给该方法的任务的确切顺序。onSuccess()listwhenAllSuccess()

还有另一种方法,那就是使用方法。但根据应用的用例,你可以使用 eiter 方法或方法。请参阅此处的官方文档Tasks.continueWith()whenAllSuccess()continueWith()


答案 2

推荐