单击按钮后应用程序崩溃 - Firebase

时间:2016-08-30 19:58:35

标签: java android firebase firebase-realtime-database

单击按钮后,我的应用程序崩溃

@Override
public void onClick(View view) {

    if (view == buttonSendMessage) {

        mDatabase.child("messages").child(myEmail).child(recipientEmail).child(String.valueOf(listViewSendMessage.getAdapter().getCount() + 1)).child("sender").setValue(myEmail);
        mDatabase.child("messages").child(myEmail).child(recipientEmail).child(String.valueOf(listViewSendMessage.getAdapter().getCount() + 1)).child("text").setValue(editTextSendMessage.getText().toString());

        //po tomto to padne na fore
    }

}

这是onCreate方法中的代码:

FirebaseDatabase database = FirebaseDatabase.getInstance();
    DatabaseReference myRef = database.getReference("messages/" + myEmail + "/" + recipientEmail);

    myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            // This method is called once with the initial value and again
            // whenever data at this location is updated.

            arrayList2.clear();
            arrayList.clear();

            for (final DataSnapshot snapshot : dataSnapshot.getChildren()) {

                GenericTypeIndicator<Map<String, Object>> m = new GenericTypeIndicator<Map<String, Object>>() {
                };
                final Map<String, Object> map = snapshot.getValue(m);

                sender = map.get("sender").toString();
                message = map.get("text").toString();

                arrayList2.add(map.get("sender").toString());
                arrayList2.add(map.get("text").toString());

.............................................等< / p>

它在以下几行崩溃:

sender = map.get("sender").toString();
message = map.get("text").toString();

但只有当我点击按钮时它才会崩溃。该按钮可将数据添加到Firebase数据库。它会因为无法将null转换为String而导致崩溃,但是当我再次打开应用程序时,一切正常。只有当我按下按钮时它才会崩溃。但是我不明白为什么它崩溃了,因为它在onCreate方法中调用的行崩溃并且它没有崩溃。

数据库外观:

enter image description here

感谢您的帮助。

{
  "messages" : {
    "samo@gmailcom" : {
      "samodubovec@gmailcom" : [ null, {
        "sender" : "samo@gmailcom",
        "text" : "hejns"
      }, {
        "sender" : "samo@gmailcom",
        "text" : "hhhhh"
      }, {
        "sender" : "samo@gmailcom",
        "text" : "dhhdhuxd"
      }, {
        "sender" : "samo@gmailcom",
        "text" : "yjjsjyy"
      } ]
    }
  }

1 个答案:

答案 0 :(得分:0)

最好使用DatabaseReference.push()添加数据而不是计算数组的大小,它基于时间戳,因此会按时间顺序排序。发生此错误是因为firebase将数据检测为列表而不是对象,并且该列表的索引0为null

保存数据时

String pushKey = mDatabase.child("messages").child(myEmail).child(recipientEmail).push().getKey();
mDatabase.child("messages").child(myEmail).child(recipientEmail).child(pushKey).child("sender").setValue(myEmail);
mDatabase.child("messages").child(myEmail).child(recipientEmail).child(pushKey).child("text").setValue(editTextSendMessage.getText().toString());

或者,如果您仍想使用索引方式(从1开始递增),则可以向快照条目添加检查器。

for (final DataSnapshot snapshot : dataSnapshot.getChildren()) {
    if (snapshot.exists()) {
        GenericTypeIndicator<Map<String, Object>> m = new GenericTypeIndicator<Map<String, Object>>() {};
        final Map<String, Object> map = snapshot.getValue(m);

        sender = map.get("sender").toString();
        message = map.get("text").toString();

        arrayList2.add(map.get("sender").toString());
        arrayList2.add(map.get("text").toString());
    }
}