Per prima cosa, voglio capire quando viene archiviata una classe come viene archiviata.
Inizio con un codice semplicissimo.
reference.child("persona").setValue("fanqulo");E vediamo in termini di key-value cosa ne viene fuori.
Ecco, viene una coppia key-value in cui key è il nome del nodo e value è il valore.
Ora vediamo se al posto del "fanqulo" ci metto una istanza di classe:
reference.child("persona").setValue(new Persona("Mario","Rossi","Operaio")); } public class Persona { public String nome; public String cognome; public String professione; public Persona(String nome, String cognome, String professione){ this.nome=nome; this.cognome=cognome; this.professione=professione; }
Ora vediamo di ottenere key e value per la prima e per la seconda:
Per la prima:
System.out.println(reference.child("persona").getKey()); reference.child("persona").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { System.out.println(dataSnapshot.getValue()); } @Override public void onCancelled(DatabaseError databaseError) { } });
09-02 23:28:40.210 25588-25588/com.example.antonello.palestradatabase I/System.out: persona 09-02 23:28:40.330 25588-25588/com.example.antonello.palestradatabase D/OpenGLRenderer: Enabling debug mode 0 09-02 23:28:40.440 25588-25588/com.example.antonello.palestradatabase I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@41e806f8 time:10096272 09-02 23:28:50.390 25588-25608/com.example.antonello.palestradatabase W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. 09-02 23:29:00.280 25588-25588/com.example.antonello.palestradatabase I/System.out: fanqulo
Ora per la seconda (le istruzioni sono le stesse):
09-02 23:36:58.086 31230-31230/com.example.antonello.palestradatabase I/System.out: persona 09-02 23:36:58.116 31230-31230/com.example.antonello.palestradatabase I/System.out: {professione=Stronzo, cognome=Iaccarino, nome=Antonello}Sì, perfetto.
Ora, in questo dataSnapshot, voglio vedere solo la professione.
Scrivo un codice che nell'ambito del dataSnapshot mi identifichi un solo valore.
reference.child("persona").setValue(new Persona("Antonello","Iaccarino","Stronzo")); System.out.println(reference.child("persona").child("professione").getKey()); reference.child("persona").child("professione").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { System.out.println(dataSnapshot.getValue()); } @Override public void onCancelled(DatabaseError databaseError) { } });E vediamo.
09-02 23:44:24.031 6244-6244/com.example.antonello.palestradatabase I/System.out: professione 09-02 23:44:24.211 6244-6244/com.example.antonello.palestradatabase I/System.out: StronzoPerfetto!
Ora mi predispongo al posto della professione, un'immagine!
La classe è questa:
public class Persona { public String nome; public String cognome; public String ritratto; public Persona(String nome, String cognome, String ritratto){ this.nome=nome; this.cognome=cognome; this.ritratto=ritratto; } }E me la inizializzo così:
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo); ByteArrayOutputStream baos=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,100,baos); byte[] byteImage=baos.toByteArray(); String stringImage= Base64.encodeToString(byteImage,Base64.DEFAULT); Persona persona=new Persona("Antonello","Iaccarino",stringImage); reference.child("persona").setValue(persona);Vediamo cosa viene archiviato su Firebase...
Dunque l'immagine viene archiviata come stringa, a quanto pare.
Adesso commentizzo il codice che è stato usato per l'archiviazione e scrivo un codice che avrebbe lo scopo di riconvertire la stringa in immagine e farlo apparire su una imageView che ho sull'activity.
Provo prima a riportare il valore in stringa:
reference.addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot) { String stringResult=(String)dataSnapshot.getValue(); System.out.println(stringResult); } @Override public void onCancelled(DatabaseError databaseError) { } })Ho ottenuto un errore perché dataSnapshot.getValue() non è castabile a String.
Ho fatto altri tentativi vari finché ho trovato il modo: usare semplicemente dataSnapshot.toString():
reference.addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot) { String stringResult=dataSnapshot.toString(); System.out.println(stringResult); } @Override public void onCancelled(DatabaseError databaseError) { } });E ottengo questo:
09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: DataSnapshot { key = null, value = {persona={ritratto=/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEB 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/2wBDAQEBAQEBAQEBAQEBAQEBAQEBAQEB 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQH/wAARCAHgAeADASIA 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx 09-03 00:02:40.611 20611-20611/com.example.antonello.palestradatabase I/System.out: BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK ..... .....Mi accorgo che ho applicato il listener a reference e non a un child.
Correggo:
reference.child("persona").child("ritratto").addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot) { String stringResult=dataSnapshot.toString(); System.out.println(stringResult); } @Override public void onCancelled(DatabaseError databaseError) { } });E vediamo...
09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: 4PJG7057cubcneLj7y01b3kvLfX53u3dM+jxSUqaflzfi7X9bddnfS6d/OfEPiOOyJcA4BPQHn5z 09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: gnk8Hn6+vHGDD4+WeMx4IKp8p2+pbPUk/wAI5/2hnOMnq9QsUO4FVbp1UHHX1OPzz16kZauRu9MV 09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: 0YooyEkzhQOrHHQccI+D0x1I3HP0WGpJZhiJ8y/2LDTpvT+Jzxqw5r3fI17Tb3r8trq6Z5DnbGvS 09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: +/4cy2a62jpvq9U02foF+wJ4kGpfGKO2Xhv7AuxkA/8AP9p+D16kdvTHXPH7fXaIiz3KqNs6hUAx 09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: kNnAOM+zZyfTOSBn8Df2CBJp/wAZkkiG6X+wbvICnvqFhgcH0Un8eeRz+8Om2+qzWsstwgxtOMke 09-03 00:02:40.641 20611-20611/com.example.antonello.palestradatabase I/System.out: pxgF8fh15Ygkmv3fw7o+w4Qw8FLn58TXrXslb2koS5bXeq77tNNpPmv8NncubMKmlrSfW9/ft29H .... ....Non ci entra nella finestra LogCat, per cui credo sia stato troncato l'inizio...
Va bene, andiamo sulla fiducia e partiamo.
Riconversione di questo po' po' di stringone in immagine: facciamo il tentativo.
reference.child("persona").child("ritratto").addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot) { String stringResult=dataSnapshot.toString(); byte[] byteResult= Base64.decode(stringResult,Base64.DEFAULT); Bitmap bitmapResult= BitmapFactory.decodeByteArray(byteResult,0,byteResult.length); imageView.setImageBitmap(bitmapResult); } @Override public void onCancelled(DatabaseError databaseError) { } });E vediamo se appare l'immagine nella ImageView...
No! Illegal Argument per Base64.decode!
Ecco che però mi accorgo, riducendo la compressione della bitmap e ottenendo quindi un file più corto, che ho ottenuto anche la key del dataSnapshot, e quindi quella che veniva presentata a Base64 non era la stringa pura!
Dunque metto getValue:
Bitmap bitmap= BitmapFactory.decodeResource(getResources(),R.drawable.facciadaculo); ByteArrayOutputStream baos=new ByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.JPEG,10,baos); byte[] byteImage=baos.toByteArray(); String stringImage= Base64.encodeToString(byteImage,Base64.DEFAULT); Persona persona=new Persona("Antonello","Iaccarino",stringImage); reference.child("persona").setValue(persona); reference.child("persona").child("ritratto").addValueEventListener(new ValueEventListener(){ @Override public void onDataChange(DataSnapshot dataSnapshot) { String stringResult=dataSnapshot.getValue().toString(); byte[] byteResult=Base64.decode(stringResult,Base64.DEFAULT); Bitmap bitmapResult=BitmapFactory.decodeByteArray(byteResult,0,byteResult.length); imageView.setImageBitmap(bitmapResult); } @Override public void onCancelled(DatabaseError databaseError) { } });
E finalmente l'esperimento è riuscito!!!
Riprovo commentizzando la parte che archivia.
Perfetto!
Questo commento è stato eliminato dall'autore.
RispondiElimina