java - Android 聊天在 DataSnapshot.getValue() 上因时间戳而崩溃

标签 java android firebase

我正在尝试修改 Firebase 的 Android 聊天示例以包含 Firebase 时间戳值。我可以使用 ServerValue.TIMESTAMP; 发送时间戳,但是当 Firebase 尝试显示消息时,应用程序崩溃了。编辑:下面的完整错误输出

发送消息我使用

private void sendMessage() {
    EditText inputText = (EditText)findViewById(R.id.messageInput);
    String input = inputText.getText().toString();
    Map timestamp = ServerValue.TIMESTAMP;

    if (!input.equals("")) {
        // Create our 'model', a Chat object
        Chat chat = new Chat(name, input, timestamp, userID);
        // Create a new, auto-generated child of that chat location, and save our chat data there
        chatRef.push().setValue(chat);
        inputText.setText("");
    }
}

熔炉的结构是这样的:

->Messenger
  |--> room
      |--> messages
        |--> messageID
          |--> from: "Name"
          |--> text: "Message"
          |--> timestamp: xxxxxxxxxxxxx
          |--> userID: "id"

和聊天.java

public class Chat {

    private String from;
    private String text;
    private int userID;
    private Map<String, String> timestamp = new HashMap<String, String>();

    // Required default constructor for Firebase object mapping
    @SuppressWarnings("unused")
    private Chat() { }

    Chat(String from, String text, Map timestamp, int userID) {
        this.from = from;
        this.text = text;
        this.timestamp = timestamp;
        this.userID = userID;
    }

    public String getFrom() {
        return from;
    }

    public String getText() {
        return text;
    }

    public Map getTimestamp() {
        return timestamp;
    }

    public int getuserID() {
        return userID;
    }
}

如果我从 Firebase 上的消息中删除时间戳字段,应用程序不会崩溃。

完整的错误信息如下:

08-26 15:08:08.223  18097-18097/com.firebase.androidchat E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.firebase.androidchat, PID: 18097
    com.firebase.client.FirebaseException: Failed to bounce to type
            at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:185)
            at com.firebase.androidchat.FirebaseListAdapter$1.onChildAdded(FirebaseListAdapter.java:63)
            at com.firebase.client.core.ChildListenerContainer$1.run(ChildListenerContainer.java:52)
            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:5001)
            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:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: com.shaded.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of VALUE_NUMBER_INT token
            at [Source: java.io.StringReader@41f8c588; line: 1, column: 2] (through reference chain: com.firebase.androidchat.Chat["timestamp"])
            at com.shaded.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:575)
            at com.shaded.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:569)
            at com.shaded.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:310)
            at com.shaded.fasterxml.jackson.databind.deser.std.MapDeserializer.deserialize(MapDeserializer.java:26)
            at com.shaded.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:464)
            at com.shaded.fasterxml.jackson.databind.deser.impl.FieldProperty.deserializeAndSet(FieldProperty.java:107)
            at com.shaded.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:295)
            at com.shaded.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
            at com.shaded.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
            at com.shaded.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
            at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
            at com.firebase.androidchat.FirebaseListAdapter$1.onChildAdded(FirebaseListAdapter.java:63)
            at com.firebase.client.core.ChildListenerContainer$1.run(ChildListenerContainer.java:52)
            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:5001)
            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:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

看起来可能是另一个问题引起的,这让我更加困惑......

Caused by: com.shaded.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.util.LinkedHashMap out of VALUE_NUMBER_INT token
        at [Source: java.io.StringReader@41f8c588; line: 1, column: 2] (through reference chain: com.firebase.androidchat.Chat["timestamp"])

最佳答案

Firebase.ServerValue.TIMESTAMP 被设置为一个 map (包含 {.sv: "timestamp"}),它告诉 Firebase 用服务器时间填充该字段。当该数据被读回时,它是实际的 unix 时间戳,它是一个 Long。当 Firebase(使用 Jackson)尝试反序列化该返回值时,它失败了,因为它不是 Map

你可以使用 Jackson annotations控制您的类如何转换为 JSON。

例如,像这样的东西应该可以工作:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.firebase.client.ServerValue;

public class Thing {
    private String id;
    private Long creationDate;

    public Thing() {

    }

    public Thing(String id) {
        this.id = id;
    }

    public String getId() {
        return id;
    }

    public java.util.Map<String, String> getCreationDate() {
        return ServerValue.TIMESTAMP;
    }

    @JsonIgnore
    public Long getCreationDateLong() {
       return creationDate;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setCreationDate(Long creationDate) {
        this.creationDate = creationDate;
    }
}

关于java - Android 聊天在 DataSnapshot.getValue() 上因时间戳而崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25500138/

相关文章:

android - 如何使用其REST API在Android上的Google云端硬盘上访问应用程序数据

swift - 将选项卡栏项目设置为自定义图像,例如 Instagram

ios - 是否可以替代使用 NSNotificationCenter 和 kFIRInstanceIDTokenRefreshNotification 来检测过期 token ?

java - 如何设置鼠标监听器使其无法在另一个表中单击?

Android AddThis sdk + Facebook sdk 不会在 Android Studio 中构建

java - 使用 Java 求解 CPLEX .mod

重启后 Android 内容提供商 URI 不起作用

安卓火力地堡 : how get the message text component of notification message from firebase when app is in foreground

java - 为什么JPanel的子类 "TwoButtons"没有显示在屏幕上

java - Google App Engine java.lang.UnsupportedClassVersionError : org/ritesh/RiteshServlet : Unsupported major. 次要版本 51.0