单击按钮后,我的应用程序崩溃
@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方法中调用的行崩溃并且它没有崩溃。
数据库外观:
感谢您的帮助。
{
"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"
} ]
}
}
答案 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());
}
}