JavascriptProva

venerdì 21 ottobre 2016

Leggere i dati in una istanza di classe dal database Firebase.

Ora mi devo occupare della parte inversa, ossia leggere i dati dal database remoto e portarli, per mezzo di una classe consona, su un database SQLite sul cellulare.
L'ultima parte si farà con il metodo helper.save(...) avente per parametro la classe stessa.
Il problema sta nella lettura dei dati.
Vediamo...

Ecco: bisogna aggiungere un listener (ho subordinato la lettura dei dati alla pressione su un button).
         button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        System.out.println(dataSnapshot.getValue());
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
10-21 12:30:54.625 10720-10720/? I/System.out: {-KUae5VrVyXMk2lFt39t={cognome=Bianchi, professione=Ladro, nome=Carlo, eta=54}, -KUae5VW3jfCoWP2yQmc={cognome=Rossi, professione=Scassinatore, nome=Mario, eta=45}, -KUae5VsYGesGotl6PZf={cognome=Verdi, professione=Falsario, nome=Luigi, eta=36}}
Vediamo se riesco a essere un po' più specifico: qui ho aggiunto il listener a tutto il database.
Provo ad aggiungerlo a un singolo nodo...

La via migliore che ho trovato, non avendo predeterminati i nomi dei nodi, né potendovi costruire agevolmente un ciclo for...next, è quella di prendermi tutto il DataSnapshot, come da tutorial trovati, e separarlo nei singoli nodi mediante il getChildren().
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot record : dataSnapshot.getChildren()){
                            System.out.println(record.getValue());
                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
Ed eccoli in sequenza:
10-21 13:00:57.645 15520-15520/? I/System.out: {cognome=Rossi, professione=Scassinatore, nome=Mario, eta=45}
10-21 13:00:57.645 15520-15520/? I/System.out: {cognome=Bianchi, professione=Ladro, nome=Carlo, eta=54}
10-21 13:00:57.645 15520-15520/? I/System.out: {cognome=Verdi, professione=Falsario, nome=Luigi, eta=36}

Ora devo solo vedere come convertire questi in istanze della classe Persona, da poter dare in bocca al mio metodo helper.save come parametri, e il gioco è fatto...

Dopo essere ammattito un po', ho trovato quello che serve a me.
E' più semplice di quello che sembrava:
        button.setOnClickListener(new View.OnClickListener(){

            @Override
            public void onClick(View v) {
                databaseReference.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        for(DataSnapshot record : dataSnapshot.getChildren()){
                           Persona p=record.getValue(Persona.class);
                            System.out.println("NOME "+p.nome+" - COGNOME "+p.cognome+" - PROFESSIONE "+p.professione);

                        }
                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });
            }
        });
E ottengo l'immediato cambiamento sul dispositivo quando vado a cambiare qualcosa nel database remoto.

Perfetto!

Nessun commento:

Posta un commento