Pegar valores de um nó filho - Firebase

Boa tarde pessoal!

Utilizando o Real-Time Database do Firebase (Que é um NoSql), para pegar os dados de um nó temos:

DatabaseReference dref = FirebaseDatabase.getInstance().getReference().child("turmas");

A estrutura é assim:

Ai ele pega tudo…

A minha dúvida é: Como faço então se eu tiver sub nós?

Até alunos eu teria:

DatabaseReference dref = FirebaseDatabase.getInstance().getReference().child("alunos");

A estrutura seria assim:

Desde já obrigado pela ajuda!

Boa tarde, eu particularmente adiciono um listener e capturo os valores.
Um trecho de uma classe que tenho aqui

this.databaseReference.child(id).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
              // ...
            }
            callback.success(obj);
        }

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

No snapshot eu pego os valores assim em uma fábrica que eu possuo para converter o snapshot em objeto:

public static Usuario get(DataSnapshot snapshot) {
    Usuario usuario = new Usuario();
    usuario.setUid((String) snapshot.child("objectId").getValue());
    usuario.setFirstName((String) snapshot.child("firstName").getValue());
    usuario.setLastName((String) snapshot.child("lastName").getValue());
    return usuario;
}

O retorno de child() é um DataSnapshot e de getChildren() é um Iterator então vc pode ter “n” nós de profundidade que o processo é o mesmo.

Eu gosto de pegar os valores e criar uma instancia de uma classe Java por achar mais fácil trabalhar assim.
Espero ter ajudado.

1 curtida

Eu faço assim ó… bem parecido com o seu:

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

                alunos.clear();

                for (DataSnapshot postSnapshot : dataSnapshot.getChildren()) {
                    Aluno a = postSnapshot.getValue(Aluno.class);
                    alunos.add(a);
                }

                AlunoAdapter alunoAdapter = new AlunoAdapter(VisualizarAlunos.this, alunos);
                listaViewAlunos.setAdapter(alunoAdapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

O problema e´que traz os Id mais externos e eu queria os mais internos (Um nó a mais)

1 curtida

Saquei, tipo se a intenção do sub nó do aluno não é ser um array aquele nó a mais ali só vai te atrapalhar então mais pra frente pra pegar e gerar valores.

postSnapshot.child( postSnapshot.getKey() ).getValue( Aluno.class );

Não testei, mas assim você já vai ta dentro do nó.

No meu app eu fiz uma fábrica que recebia o DataSnapshot e atribuía os valores por minha conta pra eu ter controle do que tava acontecendo.

1 curtida

Pô cara… fiquei bem feliz pq parece uma solução bem bacana…
Porém testei aqui e deu erro.
Tá retornando null. :disappointed_relieved:

Mais eu sinto que é por ai o caminho…

1 curtida

Eita ai vamos ter que usar o debug…rsrs
Tem que ver se o valor do getKey() ta correto e se tiver, tem que ta vindo um dataSnapshot ai tenta pegar um valor isolado do snapshot tipo:

snapshot.child("id").getValue();
1 curtida

É pq o cenário é assim ó:

Tem esse relacionamento ai. Ai a ideia é entrar no id da turma e pegar a lista de alunos.

Ai peguei assim pra testar…

postSnapshot.child("-KuyHD_TleoZm19vopTc").getValue(Aluno.class);

Só que retorna null

1 curtida

Na hora que eu chamo a minha referência do banco…

DatabaseReference dbAlunos = FirebaseDatabase.getInstance().getReference().child("alunos");

(Isso fica no onCreate)

Isso chama o nó ‘alunos’…
O que eu poderia acrescentar pra chamar logo aqui um nó a mais?

1 curtida

A tá, do jeito que a gente ta fazendo teria que mergulhar mais um getChildren() então. Aí tem que fazer um método/classe pra não embolar o código

// "-KuyHD_TleoZm19vopTc" é o postSnapshot.getKey() né
for (DataSnapshot snapshot : postSnapshot.child("-KuyHD_TleoZm19vopTc").getChildren() ) {
    Aluno aluno = snapshot.getValue( Aluno.class );
}

Se você tiver o id da turma antes de chegar aqui, ai dá pra fazer

FirebaseDatabase.getInstance()
    .getReference("alunos")
    .child( idTurma )
    .addValueEventListener(
       // callbacks
     );

E aí você ja pega do jeito que já tava fazendo ai que tá certissímo.

2 curtidas

Pô cara… é exatamente isso! Deu certo demais! Vlw mesmo!

1 curtida

Mas e quando não sabemos qual a key a ser selecionada? por exemplo: ele n ter esse “-KuyHD_TleoZm19vopTc” e no lugar ter algo parecido com os usuarios user.uid, tem algo parecido?, pq eu preciso que ele faça update, ou sejá ele seleciona atraves de um picker preenche os dados e então o usuario edita e reenvia porem eu n sei como especificar a ele para que ele edite apenas aquela subnó(key) do firebase.

Tenho um nó, e dentro do nó tenhos meus dados, como faço para pegar o item de todos os dados,e carregar em varios textView? sei que tem como carregar em uma listview mas como faço para pegar o nome de todos os item da listview? ou carregar os textview direto do firebase