i keep getting error com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String when i attempt to retrieve data in the database and display it on a textView.
Data on firebase database screenshot:
Here is my object model
public class AdminOrders {
private String customeraddress, customername, customerphone, date, state, time, totalAmount;
public AdminOrders() {
}
public AdminOrders(String customeraddress, String customername, String customerphone, String date, String state, String time, String totalAmount) {
this.customeraddress = customeraddress;
this.customername = customername;
this.customerphone = customerphone;
this.date = date;
this.state = state;
this.time = time;
this.totalAmount = totalAmount;
}
public String getCustomeraddress() {
return customeraddress;
}
public void setCustomeraddress(String customeraddress) {
this.customeraddress = customeraddress;
}
public String getCustomername() {
return customername;
}
public void setCustomername(String customername) {
this.customername = customername;
}
public String getCustomerphone() {
return customerphone;
}
public void setCustomerphone(String customerphone) {
this.customerphone = customerphone;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public String getTotalAmount() {
return totalAmount;
}
public void setTotalAmount(String totalAmount) {
this.totalAmount = totalAmount;
}
}
And here is my code.
public class AdminNewOrdersActivity extends AppCompatActivity {
private RecyclerView orderList;
private DatabaseReference ordersRef;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_admin_new_orders);
ordersRef = FirebaseDatabase.getInstance().getReference().child("Orders");
orderList = findViewById(R.id.recyclerView_vieworders);
orderList.setLayoutManager(new LinearLayoutManager(this));
}
@Override
protected void onStart() {
super.onStart();
FirebaseRecyclerOptions<AdminOrders> options = new FirebaseRecyclerOptions.Builder<AdminOrders>()
.setQuery(ordersRef, AdminOrders.class)
.build();
FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder> adapter =
new FirebaseRecyclerAdapter<AdminOrders, AdminOrdersViewHolder>(options) {
@Override
protected void onBindViewHolder(@NonNull AdminOrdersViewHolder holder, int position, @NonNull AdminOrders model) {
holder.username.setText(model.getCustomername());
holder.phonenum.setText(model.getCustomerphone());
holder.totalprice.setText(model.getTotalAmount());
holder.address.setText(model.getCustomeraddress());
holder.datetime.setText(model.getDate() + " " + model.getTime());
}
@NonNull
@Override
public AdminOrdersViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.order_layout, parent, false);
return new AdminOrdersViewHolder(view);
}
};
orderList.setAdapter(adapter);
adapter.startListening();
}
public static class AdminOrdersViewHolder extends RecyclerView.ViewHolder {
public TextView username, phonenum, totalprice, address, datetime;
public Button showorderproducts;
public AdminOrdersViewHolder(@NonNull View itemView) {
super(itemView);
username = itemView.findViewById(R.id.textView_username_adminorders);
phonenum = itemView.findViewById(R.id.textView_phonenum);
totalprice = itemView.findViewById(R.id.textView_price);
address = itemView.findViewById(R.id.textView_address);
datetime = itemView.findViewById(R.id.textView_datetime);
showorderproducts = itemView.findViewById(R.id.button_showorderproducts);
}
}
}
Full Stacktrace:
FATAL EXCEPTION: main
Process: com.dbethelfarm.bethelfarmgate, PID: 23665
com.google.firebase.database.DatabaseException: Failed to convert value of type java.lang.Long to String
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertString(com.google.firebase:firebase-database@@19.2.0:425)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.2.0:216)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToType(com.google.firebase:firebase-database@@19.2.0:178)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.access$100(com.google.firebase:firebase-database@@19.2.0:47)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.2.0:592)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper$BeanMapper.deserialize(com.google.firebase:firebase-database@@19.2.0:562)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(com.google.firebase:firebase-database@@19.2.0:432)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(com.google.firebase:firebase-database@@19.2.0:231)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(com.google.firebase:firebase-database@@19.2.0:79)
at com.google.firebase.database.DataSnapshot.getValue(com.google.firebase:firebase-database@@19.2.0:203)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:29)
at com.firebase.ui.database.ClassSnapshotParser.parseSnapshot(ClassSnapshotParser.java:15)
at com.firebase.ui.common.BaseCachingSnapshotParser.parseSnapshot(BaseCachingSnapshotParser.java:36)
at com.firebase.ui.common.BaseObservableSnapshotArray.get(BaseObservableSnapshotArray.java:52)
at com.firebase.ui.database.FirebaseRecyclerAdapter.getItem(FirebaseRecyclerAdapter.java:109)
at com.firebase.ui.database.FirebaseRecyclerAdapter.onBindViewHolder(FirebaseRecyclerAdapter.java:149)
at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6781)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6823)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5752)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6019)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5858)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5854)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2230)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1557)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1517)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:612)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3924)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3641)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4194)
at android.view.View.layout(View.java:15697)
at android.view.ViewGroup.layout(ViewGroup.java:5064)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:15697)
at android.view.ViewGroup.layout(ViewGroup.java:5064)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:579)
at android.widget.FrameLayout.onLayout(FrameLayout.java:514)
at android.view.View.layout(View.java:15697)
at android.view.ViewGroup.layout(ViewGroup.java:5064)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1703)
at android.widget.LinearLayout.layoutVertical(LinearLayout
String totalAmount
is causing the issue.In your FirebaseDB it shows value as
0
which is of along
value type. But in your POJO class it is declared asString
. Hence the exception.Solution:
Just change the type to
long
and you are good to go. For getters and setters of totalAmount you have to change type tolong
as well.OR
Change the
totalAmount
type to String inFirebaseDB
.I recommend the first approach as it is a number which might be used in some calculations in the future.