【发布时间】:2014-10-19 10:38:32
【问题描述】:
我正在尝试修改 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"
还有 Chat.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"])
【问题讨论】: