【问题标题】:Firebase Null object ReferenceFirebase Null 对象参考
【发布时间】:2017-12-10 20:11:04
【问题描述】:

运行 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

【问题讨论】:

  • 根据 Logcat 的说法,问题出在您致电 toString() 时。很简单,dataSnapshot.child("Content").getValue() 中的值是NULL,验证它是否返回您希望返回的内容。
  • 我明白,但为什么呢?如果值为 NULL,为什么还要更新 Firebase?问题是否可能是 onChildAdded 方法在三个值被推送之前运行?
  • 如何初始化reference?我在你的代码中看不到它。
  • FirebaseDatabase 数据库 = FirebaseDatabase.getInstance(); DatabaseReference 参考 = database.getReference("Messages");

标签: android firebase firebase-realtime-database nullpointerexception


【解决方案1】:

我想我遇到了类似的问题,Frank 的回复帮助了我: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,但内容仍然缺失。尝试将它们设置为单个消息对象。

【讨论】:

    猜你喜欢
    • 2015-09-11
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-30
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多