Firestore - 在本地合并两个查询

时间:2018-05-01 14:30:43

标签: java android firebase google-cloud-firestore

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

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

我的想法是将第二个查询放在第一个查询的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 个答案:

答案 0 :(得分:7)

要在本地合并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()方法时,结果是list个对象,这些对象具有作为参数传递到whenAllSuccess()方法的任务的确切顺序。

还有另一种方法,那就是使用Tasks.continueWith()方法。但根据您应用的用例,您可以使用eiter whenAllSuccess()方法或continueWith()方法。请在此处查看official documentation