Finora mi sono occupato del cancellare di sana pianta tutto il database Firebase e riscriverlo da cellulare, e viceversa.
Ora mi dovrei occupare del modificare singoli record, perché se si modifica un singolo record cancellare e riscrivere tutto il database mi sembra un po' come quello che si compra la macchina nuova perché i posacenere di quella vecchia sono ormai pieni.
Innanzitutto devo cercare sul Firebase il mio record mediante una chiave, e userò la chiave primaria _id.
La ricerca andrà fatta mediante le query di firebase.
Se la ricerca non è vana, ossia se la query dà dei risultati, posso cancellare o modificare il mio singolo record mediante l'apposito codice.
Se ho da aggiungere un record, invece, nel caso la query mi dia ricerca vana devo usare il push().
Posso unire le due cose dicendo "Se c'è modificalo, se non c'è aggiungilo".
Bene: primo compito. Individuare un record e cancellarlo.
Per individuare un record devo creare una query.
Mettiamo che voglio individuare il record n.2
Query query=reference.orderByChild("_id").equalTo(2);Ora pongo la condizione che esista. Vediamo il numero di children che ha la query:
Query query=reference.orderByChild("_id").equalTo(2); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { System.out.println(dataSnapshot.getChildrenCount()); } @Override public void onCancelled(DatabaseError databaseError) { } });Ci sono riuscito.
Funziona egregiamente.
Ora creo la funzione "cancella" per cancellare selettivamente questo record. Ecco:
Query query=reference.orderByChild("_id").equalTo(2); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { dataSnapshot.getRef().removeValue(); } @Override public void onCancelled(DatabaseError databaseError) { } });Vediamo...
No, non funziona. Il dataSnapshot.getRef() così facendo è ancora relativo alla radice del database.
Provvedo:
Query query=reference.orderByChild("_id").equalTo(2); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for(DataSnapshot child : dataSnapshot.getChildren()){ child.getRef().removeValue(); } } @Override public void onCancelled(DatabaseError databaseError) { } });E così funziona.
Ora devo provvedere al codice che aggiunge un record al database nel caso questo sia assente.
bttAggiungiRecord.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Query query=reference.orderByChild("_id").equalTo(2); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.getChildrenCount()==0){ Cursor crs=helper.query(); crs.moveToFirst(); do{ if(crs.getInt(0)==2){ PersonaOut p=new PersonaOut(crs.getInt(0), crs.getString(1),crs.getString(2), crs.getInt(3),crs.getString(4)); reference.push().setValue(p); } }while(crs.moveToNext()); } } @Override public void onCancelled(DatabaseError databaseError) { } }); } });Benissimo!
Ora voglio fare che invece se è presente lo modifica.
Ecco, sì:
bttAggiungiRecord.setOnClickListener(new View.OnClickListener(){ @Override public void onClick(View v) { Cursor crs=helper.query(); crs.moveToFirst(); do{ if(crs.getInt(0)==2){ p=new PersonaOut(crs.getInt(0), crs.getString(1),crs.getString(2), crs.getInt(3),crs.getString(4)); } }while(crs.moveToNext()); Query query=reference.orderByChild("_id").equalTo(2); query.addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { if(dataSnapshot.getChildrenCount()==0){ System.out.println(dataSnapshot.getChildrenCount()); reference.push().setValue(p); } if(dataSnapshot.getChildrenCount()==1){ System.out.println(dataSnapshot.getChildrenCount()); for(DataSnapshot child : dataSnapshot.getChildren()){ child.getRef().setValue(p); } } } @Override public void onCancelled(DatabaseError databaseError) { } }); } });
Nessun commento:
Posta un commento