访问儿童Firebase中的儿童

时间:2019-04-25 08:58:48

标签: android firebase firebase-realtime-database

这不是重复项。 我正在尝试访问Firebase中一个孩子中的一个孩子,然后将该孩子放入回收站适配器中。它不会显示在回收站适配器中。这里也有类似的问题,但是在实施时仍然无法正常工作。

当前使用适配器,消息对象和片段。

JsonProperty
Fragment Activity

    private ArrayList<Messages> results = new ArrayList<>();
    private void listenForChat() {
        final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
                .child("receivedMessages");
        messageUrlDb = userDb.child("messageUrl");

        messageUrlDb.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                String message = "";
                if (dataSnapshot.child("messageUrl").getValue() != null)
                    message = dataSnapshot.child("messageUrl").getValue().toString();
                Messages obj = new Messages(message, name, image);
                if (!results.contains(obj)) {
                    results.add(obj);
                    messagesList.setAdapter(mAdapter);
                    mAdapter.notifyDataSetChanged();
                    initializeDisplay();
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { }
        });
    }

Firebase database

我正在尝试访问(messageUrl)用户-> receiveMessages-> messageUrl。但是,由于有一个键,我认为它不像messagesUrl那样远。对于回收站适配器,它需要将messagesUrl作为字符串接收并进行相应的更新,但我做不到。

如果需要更多代码,我可以发布。谢谢。

1 个答案:

答案 0 :(得分:2)

这就是您附加ValueEventListener的方式:

final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
        .child("receivedMessages");
messageUrlDb = userDb.child("messageUrl");

messageUrlDb.addValueEventListener(new ValueEventListener() {

如果我们从这段代码中获取路径,则您会将侦听器附加到/users/$uid/receivedMessages/messageUrl。您显示的数据中不存在此路径,因此您的onDataChanged将被调用,并带有一个空快照。

如果您想为用户阅读所有消息,则应将侦听器附加到/users/$uid/receivedMessages并在onDataChanged内解析快照:

final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
        .child("receivedMessages");
userDb.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for (DataSnapshot userMessages: dataSnapshot.getChildren()) {
            for (DataSnapshot messageSnapshot: userMessages.getChildren()) {
                System.out.println(messageSnapshot.getKey()+": "+messageSnapshot.getChild("messageUrl").getValue(String.class));
            }
        }
    }
    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) { 
        throw databaseError.toException(); // don't ignore errors
    }
});

这会循环遍历用户receivedMessages节点下的两个子节点。