我正在尝试将firebase数据库添加到我的android studio项目中。 当我运行我的应用程序(在模拟器上)时,我收到以下错误:
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.inbar.amit.ksharet, PID: 2778
com.firebase.client.FirebaseException: Failed to bounce to type
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:183)
at com.inbar.amit.ksharet.updates$1.onChildAdded(updates.java:52)
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser$1.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
Caused by: com.fasterxml.jackson.databind.JsonMappingException: Can not deserialize instance of java.lang.String out of START_OBJECT token
at [Source: java.io.StringReader@2729553; line: 1, column: 1]
at com.fasterxml.jackson.databind.DeserializationContext.mappingException(DeserializationContext.java:575)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:46)
at com.fasterxml.jackson.databind.deser.std.StringDeserializer.deserialize(StringDeserializer.java:11)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2888)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2034)
at com.firebase.client.DataSnapshot.getValue(DataSnapshot.java:181)
... 11 more
这是我的代码(用于从数据库中读取数据):
public class updates extends AppCompatActivity {
private Firebase mRef;
private ArrayList<String> messages = new ArrayList<>();
Random rnd = new Random();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_updates);
mRef = new Firebase("https://ksharet-d6a24.firebaseio.com/message");
// Get ListView object from xml
final ListView listView = (ListView) findViewById(R.id.ListView);
// Create a new Adapter
final ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_list_item_1, messages);
// Assign adapter to ListView
listView.setAdapter(adapter);
mRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String message = dataSnapshot.getValue(String.class);
Log.v("E_CHILD_ADDED", message);
messages.add(0, message);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
}
我应该怎么做才能解决它?
答案 0 :(得分:0)
我相信如果你使用String message = dataSnapshot.child("message").getValue(String.class);
它应该有效。为什么?那么你的数据结构是这样的:
{ "message" : // Listener attached here @ https://ksharet-d6a24.firebaseio.com/message
{ "-KUTSl1Z-UPLM0lst2OL" : // child here
{
"message" : "שלום וברוכים הבאים לאפליקציה החדשה של בית הספר ״יגאל אלון״",
"title" : "שלום"
}
}
}
当您调用dataSnapshot.getValue(String.class)时,它试图将其转为:
{
"message" : "שלום וברוכים הבאים לאפליקציה החדשה של בית הספר ״יגאל אלון״",
"title" : "שלום"
}
到一个字符串,它不是(它是一个有两个值,一个消息和一个标题的对象)。如果使用child method,则可以获取该对象的消息子节点,即String。
请注意,如果你创建一个这样的类,你也可以将对象反序列化为POJO:
public class Message {
public String message;
public String title;
public Message() {
// Default constructor required for calls to DataSnapshot.getValue(Message.class)
}
public User(String message, String title) {
this.message = message;
this.title = title;
}
}
然后让您的ArrayList存储消息对象并使用getValue(Message.class)