Firestore – 在本地合并两个查询

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

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

我的想法是将第二个查询放在第一个查询的onSuccessListener中。 这是一个表现明智的坏主意吗?

 public void loadNotes(View v) { collectionRef.whereLessThan("priority", 2) .orderBy("priority") .get() .addOnSuccessListener(new OnSuccessListener() { @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() { @Override public void onSuccess(QuerySnapshot queryDocumentSnapshots) { for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) { Note note = documentSnapshot.toObject(Note.class); //adding the results to a List } } }); } }); } 

要在本地合并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>() { @Override public void onSuccess(List list) { //Do what you need to do with your list } }); 

如您所见,当覆盖onSuccess()方法时,结果是一个对象list ,它具有作为参数传递到whenAllSuccess()方法的任务的确切顺序。

还有另一种方法,那就是使用Tasks.continueWith()方法。 但是根据你的应用程序的用例,你可以使用whenAllSuccess()方法或continueWith()方法。 请在这里看到官方文档 。