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

时间:2018-04-12 18:37:39

标签: android firebase firebase-realtime-database

我正在尝试使用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);
            }
        }

2 个答案:

答案 0 :(得分:1)

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

只有位置是json本身时才能使用Map

例如:

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

因此,如果这是Firebase数据节点,则使用您使用的Map。

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

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

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

答案 1 :(得分:1)

好的,终于有了这个工作。我使用addChildEventListener代替addValueEventListener,将Map map = dataSnapshot.getValue(Map.class);替换为Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();,一切正常。