2015-06-19 17 views
38

Utilizzando Firebase Library per inviare i dati al server in forma Message(String, String) aggiunto al HashMap<String, Message>Come convertire i dati Firebase in oggetti Java ...?

Esempio:

Firebase fb = new Firebase(URL); 
Firebase msgRef = fb.child("finished"); 
HashMap<String, Message> msgList = new HashMap<>(); 
Message msg = new Message(m, n); 
msgList.put(HASHKEY, msg); 
msgRef.push().setValue(msgList); 

Durante la ricezione di dati con metodo Firebase addValueEventListener() ottenere String nel presente formulario

{ key = finished, value = { 
    -Js9Rn0uttjYIGdcv8I1={Moosa={message=email, name=Kamran}}, 
    -Js9Vsmv6BnVzOzpl2L8={Moosa={message=msgs, name=Imran}}, 
    -Js9WtQ8yeDwVxQMFCZb={Moosa={message=samsung, name=Samad}}, 
    -Js9RarxoJPKn4RO2HaM={Moosa={message=Message, name=Moosa}}, 
    -Js9b6f75lwwbsqQNJz0={Moosa={message=Qmobile, name=Bilal}}, 
    -Js9aDxt8TlgTGUccuxu={Moosa={message=last, name=Moosa}}} } 

Come posso convertirlo in oggetto messaggio ..... ????

risposta

91

ci sono più due modi per ottenere i dati fuori dalla Firebase DataSnapshot che non richiedono utilizzando un Map<String, Object>.

primo sistema è di utilizzare i metodi di DataSnapshot per attraversare i bambini:

ref = new Firebase("https://my.firebaseio.com/messages").limitToLast(10); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) { 
      String name = (String) messageSnapshot.child("name").getValue(); 
      String message = (String) messageSnapshot.child("message").getValue(); 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 

In questo frammento di codice che utilizziamo getChildren() per ottenere un Iterable dei vostri messaggi. Quindi usiamo child("name") per ottenere ogni specifica proprietà figlio.

Il secondo approccio è utilizzare il serializzatore/deserializzatore JSON-to-POJO incorporato. Quando si invia l'elenco dei messaggi, gli oggetti Message al suo interno vengono serializzati su JSON e archiviati in Firebase.

per farli uscire di nuovo, si deve fare l'inverso:

ref = new Firebase("https://my.firebaseio.com/messages").limitToLast(10); 
ref.addValueEventListener(new ValueEventListener() { 
    @Override 
    public void onDataChange(DataSnapshot dataSnapshot) { 
     for (DataSnapshot messageSnapshot: dataSnapshot.getChildren()) { 
      Message message = messageSnapshot.getValue(Message.class); 
     } 
    } 

    @Override 
    public void onCancelled(FirebaseError firebaseError) { } 
}); 

In questo secondo frammento di, stiamo ancora usando getChildren() per ottenere i messaggi, ma ora li deserializzare da JSON direttamente in un oggetto Message.

Per un'applicazione di esempio semplice che utilizza quell'ultimo approccio, dare un'occhiata a Firebase's AndroidChat sample. Mostra anche come gestire in modo efficiente l'elenco dei messaggi (suggerimento: FirebaseListAdapter).

+1

Nel tuo secondo approccio, come vengono mappati i dati dei Firebase sulle proprietà del pojo? Il nome della proprietà pojo e il nome del nodo firebase devono esattamente corrispondere tra loro? –

+2

@ParagKadam sì, a patto che abbiano gli stessi nomi di campo. –

+1

Cosa succede se gli attributi come "nome" e "messaggio" sono dinamici. come ottenere l'istantanea dei dati e generare un oggetto. Converti direttamente oggetti Json nell'oggetto Java. –

5

Quindi, se si vuole ottenere i messaggi che si possono fare le seguenti operazioni:

 for (DataSnapshot child : dataSnapshot.getChildren()){ 
    //child is each element in the finished list 
    Map<String, Object> message = (Map<String, Object>)child.getValue(); 
    Message msg = new Message((String) message.getValue().get("message"), 
      (String) message.get("name")); 
} 
+0

Il suo ritorno alla valore null in entrambe le condizioni ... dataSnapshot.getValue(); child.getValue(); –

+0

puoi mostrare la richiesta da inviare a firebase ?? anche quale metodo stai usando per riattivare i dati 'onDataChange' o' onChildAdded' ?? – M090009

+0

utilizzando il metodo 'onDataChange' per recuperare i dati ... –

8

iterazione i valori di dataSnapshot e ottenere i bambini utilizzando nidificato ciclo for per iterare gli elementi figli di figli e di ottenere il valore desiderato .. .

for (DataSnapshot child : dataSnapshot.getChildren()) { 
        for (DataSnapshot single : child.getChildren()) { 
         Map<String, Object> map = (Map<String, Object>) single.getValue(); 
         String a = (String) map.get("message"); 
         String b = (String) map.get("name"); 
         textView.append(b + " -- " + a + "\n"); 
        } 
       } 
2

È possibile effettuare l'operazione utilizzando ChildEventListener anziché ValueEventListener.

Ad esempio. Ho una classe chiamata match con 3 string properties {id, name, photoUrl} quindi aggiungo tutti i valori in un List. Invece di usare un ciclo for, funziona per me con questo codice.

Query queryRef = mDatabase.child("users").child(user.getUid()).child("matches"); 

    ChildEventListener listener = new ChildEventListener() { 
     @Override 
     public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) { 
      Match match = dataSnapshot.getValue(Match.class); 
      matchList.add(match); 
      mAdapter = new MatchAdapter(getContext(), matchList); 
      recyclerView.setAdapter(mAdapter); 
     } 
     @Override 
     public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) { 
      Log.d("MESSAGEFRAGMENT", "CHILDCHANGE"); 
     } 
     @Override 
     public void onChildRemoved(DataSnapshot dataSnapshot) { 
     } 

     @Override 
     public void onChildMoved(DataSnapshot dataSnapshot, String s) { 

     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 

     } 
    }; 
    queryRef.addChildEventListener(listener); 
1

È possibile fare riferimento a questa risposta se non si desidera eseguire una query per ogni lista in Firebase e piuttosto si sta utilizzando una classe e hanno HashMap all'interno della classe

https://stackoverflow.com/a/46486441/5611166

+0

amico penso che tu sia troppo tardi, sono quasi 2 anni, 3 mesi, 9 giorni, 23 ore, 37 minuti e 35 secondi fa quando ho ricevuto risposta da Frank Van e l'ho anche accettato ... –

+0

Ciao scusa per quello , stavo cercando la soluzione e mi sono imbattuto in questo. l'ho trovato e così pubblicato, potrebbe aiutare qualcun altro che sta cercando. Saluti ! @MoosaBaloch –

Problemi correlati