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 ..... ????
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
).
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"));
}
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");
}
}
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);
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
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