由于ORFirestore中没有逻辑运算符,因此我尝试在本地合并2个单独的查询。
现在,我想知道如何保持结果的正确顺序。当我独立运行2个查询时,我无法明确地查询结果(至少不是我使用该orderBy方法从Firestore获取结果的顺序)。
我的想法是将第二个查询放在第一个查询的内部onSuccessListener。这是一个坏主意的表现明智的选择吗?
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 } } }); } }); }
要在本地合并2个单独的查询,建议您使用Tasks.whenAllSuccess()方法。您可以使用以下代码行实现此目的:
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()方法。但是根据您的应用程序的用例,您可以使用whenAllSuccess()一种或多种continueWith()方法。请参阅此处的官方文档。