J'utilise firebase pour récupérer des données de la base de données n use
Map<String, String> map = dataSnapshot.getValue(Map.class);
pour obtenir des valeurs, mais il montre une erreur
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.rana.sahaj.myyu, PID: 13179
com.google.firebase.database.DatabaseException: Class Java.util.Map has generic type parameters, please use GenericTypeIndicator instead
at com.google.Android.gms.internal.zzaix.zzb(Unknown Source)
at com.google.Android.gms.internal.zzaix.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.rana.sahaj.myyu.profile.Profile$2.onDataChange(Profile.Java:158)
at com.google.Android.gms.internal.zzafp.zza(Unknown Source)
at com.google.Android.gms.internal.zzagp.zzSu(Unknown Source)
at com.google.Android.gms.internal.zzags$1.run(Unknown Source)
at Android.os.Handler.handleCallback(Handler.Java:733)
at Android.os.Handler.dispatchMessage(Handler.Java:95)
at Android.os.Looper.loop(Looper.Java:136)
at Android.app.ActivityThread.main(ActivityThread.Java:5052)
at Java.lang.reflect.Method.invokeNative(Native Method)
at Java.lang.reflect.Method.invoke(Method.Java:515)
at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:793)
at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:609)
at dalvik.system.NativeStart.main(Native Method)
voici le code
DatabaseReference profileRef=mFirebaseRef.child(EEmail);
profileRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
--> Map<String, String> map = (Map<String,String>)dataSnapshot.getValue(Map.class);
name = (TextView)findViewById(R.id.UserInActivity);
EmailView= (TextView)findViewById(R.id.emailUser);
PhotoUrl = map.get("picurl");
emmaill=map.get("userEmail");
UserNam = map.get("userNAME");
name.setText(UserNam);
EmailView.setText(emmaill);
}
@Override
public void onCancelled(DatabaseError firebaseError) {
}
});
n il n'y a pas de problème avec les valeurs clés n dans la base de données. utilisé la solution mais ne fonctionne pas
L'erreur indique correctement où vous vous trompez
Map<String, String> map = dataSnapshot.getValue(Map.class);
La classe Map utilise les paramètres pour définir les types de clé et d'objet où vous ne les indiquez pas et utilisez simplement Map.class
qui échoue.
Essayez le code ci-dessous - depuis Key sont toujours des chaînes et nous pouvons avoir n'importe quel type d'objet pour eux
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
Pour introduire la GenericTypeIndicator
, vous pouvez changer cette ligne:
Map<String, String> map = dataSnapshot.getValue(Map.class);
à ceci:
GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );
Cela devrait bien fonctionner dans votre cas. S'il vous plaît essayer et laissez-moi savoir.
J'ai eu le même problème et je l'ai résolu en manipulant Object au lieu d'essayer de le lancer dans Firebase.
Map <String, String> map = (Map)dataSnapshot.getValue();
l'a fait pour moi.
En raison de la manière dont Java implémente les génériques (effacement de type), il est nécessaire d'utiliser une méthode légèrement plus compliquée pour résoudre correctement les types de collections génériques au moment de l'exécution. Pour résoudre ce problème, Firebase Database accepte les sous-classes de cette classe dans les appels à getValue (getValue (GenericTypeIndicator), getValue (GenericTypeIndicator)) et renvoie une collection générique correctement typée.
Par exemple, vous pourriez faire quelque chose comme ceci pour obtenir une liste d'instances de Message à partir d'un DataSnapshot:
class Message {
private String author;
private String text;
private Message() {}
public Message(String author, String text) {
this.author = author;
this.text = text;
}
public String getAuthor() {
return author;
}
public String getText() {
return text;
}
}
// Later ...
GenericTypeIndicator<List<Message>> t = new GenericTypeIndicator<List<Message>>() {};
List<Message> messages = snapshot.getValue(t);
Vous devez utiliser le getCheldrin
comme suit
for (DataSnapshot snapshotNode: dataSnapshot.getChildren()) {
map.put(snapshotNode.getKey(), snapshotNode.getValue(YOUR_CLASS_TYPE.class));
}
Remplacez le YOUR_CLASS_TYPE
par le type de classe que vous attendez. notez que cette classe doit avoir un constructeur vide.