Firebase Null对象参考

时间:2017-12-10 20:11:05

标签: android firebase firebase-realtime-database nullpointerexception

运行updateList()时,它会加载来自Firebase的已输入数据。这是一个聊天应用,因此当有人键入消息时,Firebase会实时更新,也可以。

问题是我得到一个NullPointerException(不应该是这种情况)我创建一个新的Message对象(Message mess = new Mess ....)。为什么我收到这个错误,为什么我尝试的一切都不起作用?

Error = java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String java.lang.Object.toString()'。

我尝试了一个锁,一个布尔值,并试图使变量成为全局变量。

public void sendButtonClicked(View view) {

    final String messageValue = userMessage.getText().toString().trim();
    final String date = "4:20";
    final String userName = "Rob";
        if (!TextUtils.isEmpty(messageValue)) {
            final DatabaseReference newPost = reference.push();
            newPost.child("Content").setValue(messageValue);
            newPost.child("Date").setValue(date);
            newPost.child("userName").setValue(userName);
        }
    }

private void updateList() {
    reference.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Message mess = new Message(dataSnapshot.child("Content").getValue().toString(), dataSnapshot.child("Date").getValue().toString(),dataSnapshot.child("userName").getValue().toString());
            result.add(mess);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            Message message = dataSnapshot.getValue(Message.class);

            int index = getItemIndex(message);

            result.set(index, message);
            adapter.notifyItemChanged(index);
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
            Message message = dataSnapshot.getValue(Message.class);

            int index = getItemIndex(message);

            result.remove(index);
            adapter.notifyItemRemoved(index);
        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {

        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
}

数据在Firebase中的外观快照

FireBase Screesnhot

1 个答案:

答案 0 :(得分:0)

我认为我遇到了类似的问题,弗兰克的回应对我有帮助:https://groups.google.com/forum/#!topic/firebase-talk/-cdTDFBOmMw

当您在Firebase中创建新记录时,似乎您正在为每个属性分别设置setValue():

          newPost.child("Content").setValue(messageValue);
          newPost.child("Date").setValue(date);
          newPost.child("userName").setValue(userName);
           

所以正在发生的事情是,可能设置了Date的值,该值立即触发onChildAdded,但是内容仍然丢失。尝试将它们设置为单个消息对象。