由于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
}
}
});
}
});
}
答案 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。