我正在制作一个使用Firebase实时数据库的Android应用程序,当我检索数据时,我得到一个ClassCastException:java.lang.ClassCastException:java.lang.String无法强制转换为java.util.Map
这是我的Java代码
mref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map<String, Object> newPost = (Map<String, Object>) dataSnapshot.getValue();
System.out.println("First Name: " + newPost.get("FirstName"));
System.out.println("Last Name: " + newPost.get("LastName"));
}
@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) {
}
});
这是一个logcat
Process: com.firebasedemo, PID: 10509
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
at com.firebasedemo.MainActivity$1$2.onChildAdded(MainActivity.java:75)
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: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)
答案 0 :(得分:0)
我建议您不要在代码中的此阶段反序列化Ip: 42.117.1.78 - Country: Viet Nam
。 Map<String, Object>
类具有遍历数据结构的方法,如果它们失败,将导致更好的错误消息:
DataSnapshot
最好还是创建一个代表数据的类,并使用Firebase内置的JavaBeans模式处理:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("First Name: " + dataSnapshot.child("FirstName").getValue());
System.out.println("Last Name: " + dataSnapshot.child("LastName").getValue());
}
请注意,在上一个示例中,您需要将属性存储为public class Name {
String firstName;
String lastName;
public String getFirstName() {
return firstName();
}
public String getLastName() {
return lastName();
}
}
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Name name = dataSnapshot.getValue(Name.class);
System.out.println("First Name: " + name.getFirstName());
System.out.println("Last Name: " +name.getLastName();
}
和firstName
,以便它们与字段名称匹配。有办法控制它,但我从不打扰,只是确保我的JSON符合我的字段名称。