Ошибка com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type android.example.mychat.AwesomeMessage
Пишу пробное приложение чат, ни как не могу решить данную ошибку:
(com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type android.example.mychat.AwesomeMessage)
Bесь интернет облазил, все руководства прочитал, помогите пожалуйста.
MainActivity:
public class MainActivity extends AppCompatActivity {
private ListView messageListView;
private AwesomeMessageAdapter adapter;
private ProgressBar progressBar;
private ImageButton sendImageButton;
private Button sendMessageButton;
private EditText messageEditText;
private String userName;
FirebaseDatabase database;
DatabaseReference messagesDatabaseReference;
ChildEventListener messagesChildEventListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
database = FirebaseDatabase.getInstance("https://chat-41f73-default-rtdb.europe-west1.firebasedatabase.app/");
messagesDatabaseReference = database.getReference().child("messages");
progressBar = findViewById(R.id.progressBar);
sendImageButton = findViewById(R.id.sendPhotoButton);
sendMessageButton = findViewById(R.id.sendMessageButton);
messageEditText = findViewById(R.id.messageEditText);
userName = "Default User";
messageListView = findViewById(R.id.messageListView);
List<AwesomeMessage> awesomeMessages = new ArrayList<>();
adapter = new AwesomeMessageAdapter(this, R.layout.message_item,
awesomeMessages);
messageListView.setAdapter(adapter);
progressBar.setVisibility(ProgressBar.INVISIBLE);
messageEditText.addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start,
int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start,
int before, int count) {
if (s.toString().trim().length() > 0) {
sendMessageButton.setEnabled(true);
} else {
sendMessageButton.setEnabled(false);
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
messageEditText.setFilters(new InputFilter[]
{new InputFilter.LengthFilter(500)});
sendMessageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AwesomeMessage message = new AwesomeMessage();
message.setText(messageEditText.getText().toString());
message.setName(userName);
message.setImageUrl(null);
messagesDatabaseReference.push().setValue(message);
messageEditText.setText("");
}
});
sendImageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
messagesChildEventListener = new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
//////////////////////////////////
// !!! ошибка на данной строке !!!
AwesomeMessage message = dataSnapshot.getValue(AwesomeMessage.class);
adapter.add(message);
}
@Override
public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
};
messagesDatabaseReference.addChildEventListener(messagesChildEventListener);
}
}
myAdapter:
public class AwesomeMessageAdapter extends ArrayAdapter<AwesomeMessage> {
public AwesomeMessageAdapter(Context context, int resource,
List<AwesomeMessage> messages) {
super(context, resource, messages);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = ((Activity) getContext()).getLayoutInflater()
.inflate(R.layout.message_item, parent, false);
}
ImageView photoImageView = convertView
.findViewById(R.id.photoImageView);
TextView textTextView = convertView
.findViewById(R.id.textTextView);
TextView nameTextView = convertView
.findViewById(R.id.nameTextView);
AwesomeMessage message = getItem(position);
boolean isText = message.getImageUrl() == null;
if (isText) {
textTextView.setVisibility(View.VISIBLE);
photoImageView.setVisibility(View.GONE);
textTextView.setText(message.getText());
} else {
textTextView.setVisibility(View.GONE);
photoImageView.setVisibility(View.VISIBLE);
Glide.with(photoImageView.getContext())
.load(message.getImageUrl())
.into(photoImageView);
}
nameTextView.setText(message.getName());
return convertView;
}
}
Class:
public class AwesomeMessage {
String text;
String name;
String imageUrl;
public AwesomeMessage() {
}
public AwesomeMessage(String text, String name, String imageUrl) {
this.text = text;
this.name = name;
this.imageUrl = imageUrl;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
}
Ошибка в MainActivity :: ChildEventListener :: onChildAdded на строке dataSnapshot.getValue(AwesomeMessage.class);
(на всякий случай мой message_item.xml):
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="wrap_content"
android:layout_margin="16dp">
<ImageView
android:id="@+id/photoImageView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/textTextView"
android:textSize="20sp"
android:text="Text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<TextView
android:id="@+id/nameTextView"
android:text="Name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
Ошибка:
Process: android.example.mychat, PID: 5375
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type android.example.mychat.AwesomeMessage
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@16.1.0:423)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@16.1.0:214)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@16.1.0:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@16.1.0:212)
at android.example.mychat.MainActivity$4.onChildAdded(MainActivity.java:119)
at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.1.0:79)
at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.1.0:63)
at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.1.0:55)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8633)
at java.lang.reflect.Method.invoke(Native Method)
Ответы (1 шт):
В узел "messages" предварительно были добавлены String с данными, а ты пытаешься получить Object (в твоём случае AwesomeMessage).Зайди в консоль Firebase и проверь чтобы все данные в узле были в виде объектов сохранены...если нет по удаляй лишнее.