从firebase检索数据时出现ClassCastException

时间:2015-07-13 17:24:19

标签: java android firebase

我正在制作一个使用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)

1 个答案:

答案 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符合我的字段名称。