Bene, ho trovato qualcosa sull'updataggio di Firebase.
E' meglio che non ci mettiamo sbarramenti e andiamo fluidi come l'acqua.
Seguo un codice di StackOverflow...
Intanto inizio dal riferimento al database.
reference= FirebaseDatabase.getInstance().getReference();
Ora faccio riferimento a un record (child del nodo principale), usando il nome del nodo, quello "impronunciabile" attribuito dal sistema:
reference= FirebaseDatabase.getInstance().getReference();
DatabaseReference ref= reference.child("-KUae5VW3jfCoWP2yQmc");
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
E funziona:
10-23 13:10:57.145 19033-19033/? I/System.out: {cognome=Rossi, professione=Stupratore, nome=Mario, eta=45}
Ora, se io cerco nello specifico il nodo che si chiama Rossi, anziché identificarlo per mezzo del codice impronunciabile del nodo?
Usare una query.
Come si usano le query su Firebase?
Ecco, io voglio cercare Rossi, non Hxydkjlsdknsokdgrunth eccetera: come devo fare?
Ci provo...
Ottengo la reference al database:
reference= FirebaseDatabase.getInstance().getReference();
Ora, nella situazione di prima io selezionavo il nodo con il nome impronunciabile facendo così:
DatabaseReference ref= reference.child("-KUae5VW3jfCoWP2yQmc");
mentre ora provo questo:
reference= FirebaseDatabase.getInstance().getReference();
reference.orderByChild("cognome").equalTo("Rossi").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
10-23 18:02:42.041 26561-26561/? I/System.out: {-KUae5VW3jfCoWP2yQmc={cognome=Rossi, professione=Stupratore, nome=Mario, eta=45}}
Perfetto! Ora provo a eliminare la condizione equalTo:
reference.orderByChild("cognome").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
10-23 18:13:41.641 28531-28531/? I/System.out: {-KUae5VrVyXMk2lFt39t={cognome=Bianchi, professione=Squartatore, nome=Carlo, eta=54}, -KUae5VW3jfCoWP2yQmc={cognome=Rossi, professione=Stupratore, nome=Mario, eta=45}, -KUae5VsYGesGotl6PZf={cognome=Verdi, professione=Serial killer, nome=Luigi, eta=36}}
Ecco: ottengo tutti.
Ma se faccio OrderByChild("nome"):
reference.orderByChild("nome").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
10-23 18:20:05.071 29020-29020/? I/System.out: {-KUae5VrVyXMk2lFt39t={cognome=Bianchi, professione=Squartatore, nome=Carlo, eta=54}, -KUae5VW3jfCoWP2yQmc={cognome=Rossi, professione=Stupratore, nome=Mario, eta=45}, -KUae5VsYGesGotl6PZf={cognome=Verdi, professione=Serial killer, nome=Luigi, eta=36}}
L'ordine è sempre lo stesso.
Ora voglio selezionare quello che si chiama Luigi di nome:
reference.orderByChild("nome").equalTo("Luigi").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
10-23 18:27:48.931 31604-31604/? I/System.out: {-KUae5VsYGesGotl6PZf={cognome=Verdi, professione=Serial killer, nome=Luigi, eta=36}}
Perfetto!
Adesso voglio trovare quel simpatico galantuomo che fa di professione lo squartatore:
reference.orderByChild("professione").equalTo("Squartatore").addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
10-23 18:29:49.581 32582-32582/? I/System.out: {-KUae5VrVyXMk2lFt39t={cognome=Bianchi, professione=Squartatore, nome=Carlo, eta=54}}
Perfetto!
Ora faccio cambiare mestiere a un altro galantuomo per vedere se con la query "Squartatore" me li identifica tutti e due. Ecco, Mario Rossi non fa più lo stupratore ma fa lo squartatore anche lui.
Vediamo...
Non c'è stato bisogno di far correre il programma ancora: dato che il cambiamento del database mi attiva il listener ho ottenuto direttamente sulla finestra LogCat questo:
10-23 18:32:10.361 32582-32582/? I/System.out: {-KUae5VrVyXMk2lFt39t={cognome=Bianchi, professione=Squartatore, nome=Carlo, eta=54}, -KUae5VW3jfCoWP2yQmc={cognome=Rossi, professione=Squartatore, nome=Mario, eta=45}}
Perfetto!
Ora vediamo: esiste un "tipo" Query che identifichi questi gruppi selezionati per mezzo di query?
Query query= reference.orderByChild("professione").equalTo("Squartatore");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println(dataSnapshot.getValue());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Sì, esiste. Posso immagazzinare alcune queries in modo da avere la selezione già preconfezionata, forse...
Ora Mario Rossi ha messo la testa a posto e ha cambiato vita, e non fa più lo stupratore o lo squartatore, ma adesso fa il chierichetto presso la parrocchia.
Come farlo sapere anche a Firebase?
Vediamo...
Vado sul nodo:
reference= FirebaseDatabase.getInstance().getReference();
DatabaseReference ref=reference.child("-KUae5VW3jfCoWP2yQmc");
Quindi creo una HashMap, e ci metto "professione" e "Chierichetto".
Quindi applico al nodo in cui mi trovo il metodo updateChildren().
Map<String,Object> mappa=new HashMap<String,Object>();
mappa.put("professione","Chierichetto");
ref.updateChildren(mappa);
E funziona!
Ma ho identificato il galantuomo in questione con il nome impronunciabile del nodo.
Ora lo identifico in modo più umano.
Faccio una query con il cognome.
Anche Luigi Verdi ha cambiato vita, e adesso non fa più il serial killer ma il sagrestano.
Identifichiamolo con il nome.
Ho avuto molta difficoltà a individuare il nome del nodo dallo snapshot. Ecco:
Query query= reference.orderByChild("cognome").equalTo("Verdi");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot child : dataSnapshot.getChildren()){
DatabaseReference r=reference.child(child.getKey());
Map<String,Object> mappa=new HashMap<String, Object>();
mappa.put("professione","sagrestano");
r.updateChildren(mappa);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
E finalmente Verdi fa il sagrestano!
Anche l'altro galantuomo, Carlo Bianchi, rispettabile squartatore, ha deciso di mettere la testa a posto, e si fa addirittura frate! Dunque cambia anche nome: prenderà il nome di Fra' Mamozzio.
Vediamo se riusciamo a farlo sapere a Firebase...
Query query= reference.orderByChild("cognome").equalTo("Bianchi");
query.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot record : dataSnapshot.getChildren()){
DatabaseReference r = reference.child(record.getKey());
Map<String,Object> mappa = new HashMap<String, Object>();
mappa.put("professione","frate");
mappa.put("nome","Fra Mamozzio");
r.updateChildren(mappa);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Questa volta abbiamo corretto due campi. Vediamo se funziona...
Perfetto!!!