安卓-Firebase实时数据库orderByChild不起作用

3

我按照文档要求做了一切,但不知道为什么没有获得有序数据。

我的查询

 typeRef = myRef.child("DiscussionRooms").orderByChild("order");
     valueEventListener = typeRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            if (dataSnapshot.getValue() != null) {

                Log.d(TAG, "Get Data" + dataSnapshot.getValue().toString());

            }

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

我的数据库

输入图像说明

我的数据库规则

输入图像说明

响应日志

输入图像说明


1
当您对Firebase数据库执行查询时,可能会有多个结果。因此,快照包含这些结果的列表。即使只有一个结果,快照也将包含一个结果列表。您需要循环遍历dataSnapshot.getChildren()以按正确顺序获取结果,就像Alex的答案所示或以下其中之一:https://stackoverflow.com/q/37808965和https://stackoverflow.com/a/42687205。 - Frank van Puffelen
1个回答

6
为了按照 order 属性排序并显示数据,请使用以下代码:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference discussionRoomsRef = rootRef.child("DiscussionRooms");
Query orderQuery = discussionRoomsRef.orderByChild("order");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String name = ds.child("name").getValue(String.class);
            Log.d("TAG", name);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
    }
};
orderQuery.addListenerForSingleValueEvent(valueEventListener);

我在根节点上有DiscussionRooms,为什么要调用两次子节点? - Monu
抱歉,我的错误。请查看我的更新答案。只是删除了第二个方法调用。现在可以工作了吗? - Alex Mamo
如果我想要更新名称而不是获取值怎么办? - Hiraeths
@SweArmy 那么您应该使用 setValue() 方法,而不是 getValue()。别忘了还要在 ds 对象上调用 getRef() 方法。 - Alex Mamo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接