web-dev-qa-db-fra.com

La classe Java.util.Map a des paramètres de type génériques, utilisez plutôt GenericTypeIndicator

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

22
Sahaj Rana

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();
39
Shubhank

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.

28
ishmaelMakitla

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.

9
Walter

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);
0
Monis Khan

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.

0
Hesham Yassin