I\'ve looked at a few other answers for similar problems but don\'t understand why mine isn\'t working.
I\'m trying to get my app to read commands from Firebase and
In my case the problem was, that I using Kotlin class, and there were no default constructor such as
constructor() : this(0, "")
you can use constructor oop normally like this
it's the same and no Error anymore
CommandObject command = new CommandObject(ds.child("").getValue()....
fill it and make sure your reference in firebase data should not be empty
Alex posted the right solution for me, but since I was using firebase-ui and kotlin, the code used is different. More info here
val options = FirebaseRecyclerOptions.Builder<ChatMessage>()
.setQuery(query, ChatMessage::class.java)
.build()
// equivalent options object with manual parsing, use it to debug which field gives error
val options = FirebaseRecyclerOptions.Builder<ChatMessage>()
.setQuery(query, object : SnapshotParser<ChatMessage> {
override fun parseSnapshot(snapshot: DataSnapshot): ChatMessage {
val senderId = snapshot.child("senderId").getValue(String::class.java)
val receiverId = snapshot.child("receiverId").getValue(String::class.java)
val senderName = snapshot.child("senderName").getValue(String::class.java)
val text = snapshot.child("text").getValue(String::class.java)
val timestamp = snapshot.child("timestamp").getValue(Long::class.java)
return ChatMessage(senderId, receiverId, senderName, text, timestamp)
}
})
.build()
adapterMessages = object : FirebaseRecyclerAdapter<ChatMessage, ChatHolder>(options) {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ChatHolder {
val rootView = LayoutInflater.from(parent.context).inflate(R.layout.chat_message_item, parent, false)
return ChatHolder(rootView)
}
override fun onBindViewHolder(holder: ChatHolder, position: Int, model: ChatMessage) {
holder.populateItem(model)
}
}
You are getting this error:
Can't convert object of type java.lang.String to type com.parrot.sdksample.activity.CommandObject
Because you are trying to read the data of type String
which is of type CommandObject
and that why you are getting this error.
A more simple way to get those values would be to use the String
class like this:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference commandsRef = rootRef.child("drones").child("commands");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
boolean executed = ds.child("executed").getValue(Boolean.class);
String text = ds.child("text").getValue(String.class);
double timestamp = ds.child("timestamp").getValue(Double.class);
Log.d("TAG", executed + " / " + text + " / " + timestamp);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
commandsRef.addListenerForSingleValueEvent(eventListener);
And this the approach using an object of CommandObject
class:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference commandsRef = rootRef.child("drones").child("commands");
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
CommandObject commandObject = ds.getValue(CommandObject.class);
Log.d("TAG", commandObject.getExecuted() + " / " +
commandObject.getText() + " / " +
commandObject.getTimestamp());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
commandsRef.addListenerForSingleValueEvent(eventListener);
In both cases your output will be:
false / TAKE_OFF / 1.512686825309134E9
false / LAND / 1.512687248764272E9
if u are using map object in your database should use get method directly with your object
doc: DocumentSnapshot
val data = doc.get("location", SaleLocations::class.java)
I faced a similar issue where I could not retrieve the data from the database; having a DatabaseException
error with a message
can't convert from this type to that type.
The mistake I was making was I was writing incorrectly to the database. I wrote something like ...
mdatabaseReference.setValue(myObject)
instead of
mdatabaseReference.child(myObject.getId()).setValue(myObject)
So essentially the answer I am suggesting is: you should ensure your data is written correctly to the database at the right node in the JSON tree if not you would likely get this kind of error when you are reading from the database.