Firebase.database.DatabaseException:反序列化时需要一个 Map,但得到一个类 java.lang.String

问题描述 投票:0回答:4

我正在尝试使用 Firebase 数据库,但出现了该异常(在标题中)。首先我在 onDataChange:

Map map = dataSnapshot.getValue(Map.class);
下写道,但后来他们要求我使用 generictypeindicator,我照做了。然而,我现在得到了这个新的例外。我该如何解决这个问题?

以下是一些重要的代码行 enter image description here

enter image description here

    //accessing the firebase database
    database=FirebaseDatabase.getInstance();
    //creates a database references
    databaseRef1=database.getReference().child("Ben_Ptolemy");
    databaseRef2=database.getReference().child("Ptolemy_Ben");

 sendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String messageText = messageArea.getText().toString();

            if(!messageText.equals("")){
                Map<String, String> map = new HashMap<String, String>();
                map.put("message", messageText);
                map.put("user", "Ben");
                databaseRef1.push().setValue(map);
                databaseRef2.push().setValue(map);
                messageArea.setText("");
            }
        }
    });

    databaseRef1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.d("firebase received", "true");


            GenericTypeIndicator<Map<String, String>> genericTypeIndicator = new GenericTypeIndicator<Map<String, String>>() {};
            Map<String, String> map = dataSnapshot.getValue(genericTypeIndicator );
            String message = map.get("message").toString();
            String userName = map.get("user").toString();

            if(userName.equals("Ben")){
                addMessageBox("You:-\n" + message, 1);
            }
            else{
                addMessageBox("Ptolemy" + ":-\n" + message, 2);
            }
        }
android firebase firebase-realtime-database
4个回答
1
投票

正如我在评论中所说,这是一个映射问题。

只有当位置本身是 json 时才能使用地图

例如:

"Something":{
    "Name":"john"
}

因此,如果这是 Firebase 数据节点,则您可以像以前一样使用 Map。

根据您所展示的内容,您可以执行以下操作

String message = dataSnapshot.child("message").getValue(String.class);

如果您以与当前相同的方式附加侦听器,这将为您提供本或其他节点的消息值


1
投票

好吧,终于成功了。我使用

addChildEventListener
代替
addValueEventListener
,并将
Map map = dataSnapshot.getValue(Map.class);
替换为
Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
,一切正常。


0
投票

此错误一般发生在数据库名和类名设置相同的情况下!改变他们中的任何一个。不会有事的!


0
投票

com.google.firebase.database.DatabaseException:反序列化时需要一个 Map,但得到一个类 java.lang.String 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.expectMap(CustomClassMapper.java:344) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToParameterizedType(CustomClassMapper.java:261) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(CustomClassMapper.java:176) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:101) 在 com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:229) 在 com.enormousop.k.onChildAdded(来源未知:8) 在 com.google.firebase.database.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:79) 在 com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) 在 com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) 在 android.os.Handler.handleCallback(Handler.java:938) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loopOnce(Looper.java:226) 在 android.os.Looper.loop(Looper.java:313) 在 android.app.ActivityThread.main(ActivityThread.java:8751) 在 java.lang.reflect.Method.invoke(本机方法) 在 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1135)

© www.soinside.com 2019 - 2024. All rights reserved.