如何在android中通过child和equalto查询firebase?

snz8szmq  于 2021-07-07  发布在  Java
关注(0)|答案(2)|浏览(314)

这个问题在这里已经有答案了

firebase查询双嵌套(3个答案)
上个月关门了。
我的数据库中有“orderstatus”节点类型integer,我需要通过它的值(0、1、2等)来查询它。如果我使用orderbychild(“orderstatus”),它可以正常工作,但我不想下载所有数据并对其进行排序,我只想下载具有特定“orderstatus”的数据。这就是我的问题所在,当我把equalto(statusinteger)放入数据库时,我没有从数据库中得到任何数据。我做错了什么,我是不是用了equalto错了什么?

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("Orders");
Query orderRef = databaseReference
            .child(restaurantId)
            .orderByChild("orderStatus")
            .equalTo(0);
orderRef.addListenerForSingleValueEvent...

r1zk6ea1

r1zk6ea11#

为了能够按特定属性查询数据库,需要添加该特定层次结构中存在的所有子名称。在查询中,您缺少一个孩子。在“restaurantid”节点和实际 Order 对象,它持有“orderstatus”属性,还有一个节点,即“lpg…”。。。cq2”,我假设是登录用户的uid。要使其正常工作,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("Orders").child("Restaurant01").child(uid);
Query orderStatusQuery = uidRef.orderByChild("orderStatus").equalTo(0);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String userName = ds.child("userName").getValue(String.class);
            Log.d("TAG", userName);
        }
    }

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

logcat中的结果将是:

User

编辑:
根据您的评论,您要查找的内容实际上不可能与您的实际数据库结构相匹配。除此之外,在客户机上进行过滤在这种情况下绝对不是一个选项。
但是,我能想到的最好办法是创建另一个节点来存储所有用户的所有订单。这样,您就可以使用“.orderbychild”(“orderstatus”).equalto(0)”进行查询,得到所需的结果。这种做法被称为反规范化,是一种常见的做法,当谈到火基。为了更好的理解,我建议你看这个视频,非规范化是正常的firebase实时数据库。

mnemlml8

mnemlml82#

如果你从 .equalTo(... ) 那么 .orderBy(...) ?

相关问题