web-dev-qa-db-fra.com

Comment convertir des données Firebase en objet Java ...?

Utilisation de Firebase Library pour envoyer des données au serveur sous la forme Message(String, String) ajoutée au HashMap<String, Message> 

Exemple:

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);

Lors de la réception de données avec la méthode Firebase addValueEventListener() en obtenant String dans ce formulaire 

{ 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}}} }

Comment puis-je le convertir en objet de message ..... ????

47
Moosa Baloch

Il existe deux autres moyens d'extraire vos données de la base DataSnapshot de Firebase qui ne nécessitent pas l'utilisation d'un Map<String, Object>.

La première démarche consiste à utilisez les méthodes de DataSnapshot pour parcourir les enfants:

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) { }
});

Dans l'extrait ci-dessus, nous utilisons getChildren() pour obtenir une Iterable de vos messages. Ensuite, nous utilisons child("name") pour obtenir chaque propriété enfant spécifique.

La deuxième approche consiste à utiliser le sérialiseur/désérialiseur JSON-to-POJO intégré. Lorsque vous envoyez la liste de messages, les objets Message qu'elle contient sont sérialisés en JSON et stockés dans Firebase.

Pour les sortir de nouveau, vous devez faire l'inverse:

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) { }
});

Dans ce deuxième extrait, nous utilisons toujours getChildren() pour obtenir les messages, mais nous les désérialisons maintenant à partir de JSON dans un objet Message.

Pour un exemple d'application simple utilisant cette dernière approche, consultez Exemple AndroidChat de Firebase . Il montre également comment gérer efficacement la liste des messages (indice: FirebaseListAdapter).

109
Frank van Puffelen

Donc, si vous voulez recevoir les messages, vous pouvez procéder comme suit:

        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"));
}
9
M090009

Itérer les valeurs de dataSnapshot et obtenir les enfants utilisant la boucle for imbriquée pour itérer les éléments enfants des enfants et obtenir la valeur requise ... 

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");
                    }
                }
8
Moosa Baloch

Vous pouvez le faire en utilisant un ChildEventListener au lieu d'un ValueEventListener

Par exemple. J'ai une classe appelée match avec 3 propriétés de chaîne {id, name, photoUrl} puis j'ajoute toutes les valeurs dans un List. Au lieu d'utiliser une boucle for, cela fonctionne pour moi avec ce code. 

    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);
2
Sergio

Vous pouvez vous référer à cette réponse si vous ne souhaitez pas interroger chaque liste dans Firebase. Utilisez plutôt une classe et avez HashMap dans la classe

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

0
Kathan Shah

Utilisez ce code si vous souhaitez convertir un objet firebase en json:

databaseReference.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Object object = dataSnapshot.getValue(Object.class);
            String json = new Gson().toJson(object);
            Example example= new Gson().fromJson(json, Example.class);
            Log.e("json","json: " + example.getGlossary());
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Ceci convertira la structure de base de données complète en String json

0
Alok Gupta