在子级下方访问Firebase数据库对象

时间:2018-10-07 18:14:59

标签: java android firebase firebase-realtime-database

我有这样的数据结构:

enter image description here

我在民意测验参考上调用.addListenerForSingleValueEvent(),并且有一个映射到民意测验的Pojo类。但是,由于我不知道密钥的值,因此无法访问我的投票项。例如,是否可以访问display_name,还是我需要知道键的值?

1 个答案:

答案 0 :(得分:0)

如果您对要显示的民意调查一无所知,那么最好的办法就是显示所有民意调查。这可以通过将侦听器附加到/Polls来完成:

DatabaseReference ref = FirebaseDatabase.getInstance().getReference("Polls");
ref.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot pollSnapshot: dataSnapshot.getChildren()) {
            Poll poll = pollSnapshot.getValue(Poll.class);
            String key = pollSnapshot.getKey();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

如果要访问特定的民意测验,则必须知道一些可以唯一标识该民意测验的信息。最简单的就是知道它的密钥,在这种情况下,您可以像这样加载它:

String key = "-LNlisBxkPbxd00a_QH";
ref.child(key).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        Poll poll = pollSnapshot.getValue(Poll.class);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

如果您不知道键,则需要知道要选择的民意调查属性的值。例如,要获取问题y89yuvyu的所有民意调查,您可以使用以下方法查询该孩子:

ref.orderByChild("question").equalToChild("y89yuvyu").addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot pollSnapshot: dataSnapshot.getChildren()) {
            Poll poll = pollSnapshot.getValue(Poll.class);
            String key = pollSnapshot.getKey();
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
});

由于可能对该问题值进行多次民意调查,因此您需要像上面一样再次遍历结果。