我正在查询并尝试通过评分字段下订单。这是分页列表,因此我在进行部分查询。
但是我的查询未排序。
private void callRealOnlineUsersList(int page, String neededGender) {
DatabaseReference mReference = realtimeReference.child("OnlineUsers/" + neededGender);
Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
query.orderByChild("rating");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
final List<OnlineUser> userList = new ArrayList<>();
for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
OnlineUser user = postSnapshot.getValue(OnlineUser.class);
userList.add(new OnlineUser(user.getUid(), user.getName(), user.getImage(), user.getGender(), user.getCountry(), user.getRating()));
}
EventBus.getDefault().post(new ListEvent(userList));
}
日志是
D/testList: rating 2
D/testList: rating 1
D/testList: rating 25
D/testList: rating 3
D/testList: rating 1
D/testList: rating 4
D/testList: rating 1
D/testList: rating 10
D/testList: rating 2
D/testList: rating 1
D/testList: rating 25
答案 0 :(得分:1)
因此,您将3个问题合并为1个:
好消息,其中的后2个在StackOverflow上已有很好的答案!
首先,您在这里使用Query
的方式:
Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
query.orderByChild("rating");
是不正确的(这就是为什么您根本没有得到排序结果 的原因。)
相反,请尝试以下操作:
Query query = mReference
.limitToLast(page * TOTAL_ITEMS_TO_LOAD)
.orderByChild("rating");
如果您仅调用orderByChild
,它将返回执行该查询的查询,但是在您的代码中您将忽略结果。
为帮助您更清楚地了解正在发生的事情,您也可以这样做并且可以正常工作(但是您当前的代码无法保存orderByChild
调用的结果:
Query query = mReference.limitToLast(page * TOTAL_ITEMS_TO_LOAD);
query = query.orderByChild("rating");
第二,you can't sort by descending order in Firebase RTDB,因此您应该查看该问题以寻求可能的解决方案。
最后,随着page
的增加,您当前的代码将总是返回越来越多的结果-您不一定总是得到TOTAL_ITEMS_TO_LOAD
的结果。有关分页is here的更完整的SO问题。