Android的多查询和参考Firebase数据库

时间:2018-10-31 00:29:30

标签: java android firebase firebase-realtime-database

我的firebase数据库如下:

database

此查询

String currentUserID = FirebaseAuth
                            .getInstace()
                            .getCurrentUser()
                            .getUid();

DatabaseReference favorsRef = FirebaseDatabase
                                        .getInstance()
                                        .getReference()
                                        .child("favors");
Query myChatsQuery = favorsRef
                        .orderByChild("uid")
                        .equalTo(currentUserID);

我需要创建其他查询以仅从myChatsQuery中获取元组,后者具有名为“ messages”的子级。如果元组中没有子“消息”,那么我不想在新查询中插入它。

那么,如何从其他查询创建查询?

请帮助我

谢谢。

2 个答案:

答案 0 :(得分:1)

不幸的是,orderByChild()不能一次在多个相同的字段上工作,因此您可能必须分两步完成这项工作。

首先,您可以运行orderByChild()查询以寻找currentUserId,然后将所有匹配项添加到ArrayList中,然后在orderByChild()中为{ {1}}。

这看起来像这样,在代码中:

uids

上面的这段代码将与messages匹配的reference.orderByChild("uid").equalTo(currentUserId).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { if(dataSnapshot.exists()) array.add(dataSnapshot.getValue(String.class); } @Override public void onCancelled(@NonNull DatabaseError databaseError) { } )}; 添加到ArrayList uids

currentUserId

您还可以使用for循环遍历array中的所有值。

答案 1 :(得分:0)

要解决此问题,请使用以下代码:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
Query query = rootRef.child("favors").orderByChild("uid").equalTo(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            if(ds.child("messages").exists()) {
                //Do what you need to do
            }
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage());
    }
};
query.addListenerForSingleValueEvent(valueEventListener);

如您所见,您可以通过仅查询数据库一次来解决此问题。