将firebase数据库添加到Android应用程序时“无法退回键入”错误

时间:2016-10-24 22:07:29

标签: android firebase-realtime-database

我正在尝试将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) {
            }
        });
    }
}

我应该怎么做才能解决它?

1 个答案:

答案 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)