【问题标题】:Firebase.database.DatabaseException: Expected a Map while deserializing, but got a class java.lang.StringFirebase.database.DatabaseException:反序列化时需要一个 Map,但得到一个类 java.lang.String
【发布时间】:2018-04-12 18:37:38
【问题描述】:

我正在尝试使用 Firebase 数据库,但我得到了那个异常(在标题中)。首先,我在 onDataChange:Map map = dataSnapshot.getValue(Map.class); 下写道,但后来他们要求我使用 generictypeindicator,我照做了。但是,我现在得到了这个新异常。我该如何解决这个问题?

以下是一些重要的代码行

    //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);
            }
        }

【问题讨论】:

  • 发布您的 Firebase 数据,以便我们找出您的映射
  • 哪些 Firebase 数据?控制台?
  • 您附加监听器的数据库数据...
  • 还要发布 databaseRef1 正在监听的位置
  • database=FirebaseDatabase.getInstance(); databaseRef1=database.getReference().child("Ben_Ptolemy"); databaseRef2=database.getReference().child("Ptolemy_Ben");

标签: android firebase firebase-realtime-database


【解决方案1】:

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

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

例如:

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

因此,如果这是 Firebase 数据节点,您可以使用之前使用的 Map。

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

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

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

【讨论】:

  • 不抱歉,这是我自己在控制台中写的。但是当我实际通过应用程序发送消息时,消息会在控制台中显示为这样(请参阅主帖,我更新了图片)谢谢编辑:添加了 2 张图片
  • 好的,检查更新的答案。应该给你正确的价值观
  • 你编辑了什么?答案是一样的。等我试试
  • 没有人,我展示的方式..获取数据的方式不同。中间有一个子方法。它看起来很相似;)
  • 我试过了,但是字符串消息得到一个空值。这意味着它没有读取任何内容。
【解决方案2】:

好的,终于搞定了。我使用addChildEventListener 代替addValueEventListener 并将Map map = dataSnapshot.getValue(Map.class); 替换为Map&lt;String, Object&gt; map = (Map&lt;String, Object&gt;) dataSnapshot.getValue(); 并且一切正常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-20
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 2021-07-08
    • 2020-04-04
    • 2022-01-02
    相关资源
    最近更新 更多