GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Pegar valores de um nó filho - Firebase

android
firebase
Tags: #<Tag:0x00007fb3cba115e0> #<Tag:0x00007fb3cba11360>

#1

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!


#2

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.


#3

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)


#4

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.


#5

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…


#6

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();

#7

É 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


#8

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?


#9

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.


#10

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