无法将类型 java.lang.String 的对象转换为类型 - FirebaseUI
Can't convert object of type java.lang.String to type - FirebaseUI
我不明白问题出在哪里,根据我的说法一切正常。
Logcat:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.hamidmadarati.mobilsorgulari.Home.Dashboard.ui.PassengerRecyclerModel
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232)
at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80)
at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
片段:
public class PassengerFragment extends Fragment {
private RecyclerView listVehiclesWeekDay;
private FirebaseRecyclerOptions<PassengerRecyclerModel> options;
private FirebaseRecyclerAdapter<PassengerRecyclerModel, PassengerMyViewHolderRecycler> adapter;
private DatabaseReference databaseReference;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_passenger, container,false);
listVehiclesWeekDay = view.findViewById(R.id.listVehiclesWeekDay);
listVehiclesWeekDay.setHasFixedSize(true);
listVehiclesWeekDay.setLayoutManager(new LinearLayoutManager(getActivity()));
databaseReference = FirebaseDatabase.getInstance().getReference().child("Travels").child("DaysOfTheWeekSimple");
options = new FirebaseRecyclerOptions.Builder<PassengerRecyclerModel>().setQuery(databaseReference, PassengerRecyclerModel.class).build();
adapter = new FirebaseRecyclerAdapter<PassengerRecyclerModel, PassengerMyViewHolderRecycler>(options){
@Override
protected void onBindViewHolder(@NonNull PassengerMyViewHolderRecycler holder, int position, @NonNull PassengerRecyclerModel model) {
if (model.getDay() != null){
holder.titleTextView.setText(model.getDay());
}
}
@Override
public PassengerMyViewHolderRecycler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerow, parent, false);
return new PassengerMyViewHolderRecycler(view);
}
};
adapter.startListening();
listVehiclesWeekDay.smoothScrollToPosition(0);
listVehiclesWeekDay.setAdapter(adapter);
adapter.notifyDataSetChanged();
return view;
}
}
Class:
public class PassengerRecyclerModel {
private String day; //name
public PassengerRecyclerModel() {
//Empty - for Firebase Database
}
// model
public PassengerRecyclerModel(String day) {
this.day = day;
}
//Getter and Setter
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
}
当您传递以下参考时:
databaseReference = FirebaseDatabase.getInstance().getReference().child("Travels").child("DaysOfTheWeekSimple");
连同“PassengerRecyclerModel”class 到 FirebaseRecyclerOptions.Builder 的“setQuety()”方法,意味着您想使用 Firebase-UI 库来显示所有“PassengerRecyclerModel” " 对象存在于:
Travels -> DaysOfTheWeekSimple
这实际上是不可能的,因为在该引用下它只存在一个 String 类型的子项,因此出现以下错误:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.hamidmadarati.mobilsorgulari.Home.Dashboard.ui.PassengerRecyclerModel
要解决这个问题,您需要在“DaysOfTheWeekSimple”节点下添加一个额外的关卡。这可以使用 DatabaseReference 的 push() 方法简单地实现。所以当你在上面的引用处添加一个对象时,像这样添加它:
databaseReference.push().setValue(passengerRecyclerModel);
这样,您的数据库架构应该如下所示:
Firebase-root
|
--- Travels
|
--- DaysOfTheWeekSimple
|
--- $pushedId
|
--- day: "Day 5: 22-4-2021"
获取数据的代码可以保持不变
编辑:
根据您的评论:
Nope, in fact, we do not create data
如果直接在 Firebase 控制台中添加数据,将无法使用 push()。如果您不想以编程方式添加数据,仍然需要额外的层级。因此,在这种情况下,在“DaysOfTheWeekSimple”节点和“day”属性 之间,添加另一个至少包含日期或 ID 的节点,如下所示:
Firebase-root
|
--- Travels
|
--- DaysOfTheWeekSimple
|
--- 22-4-2021 //Extra level added
|
--- day: "Day 5: 22-4-2021"
the problem is when it is obtained and firebase thinks it is an object and does not convert it to a string
不“思考”,对象的类型为“PassengerRecyclerModel”,应在适配器中相应地读取。
我不明白问题出在哪里,根据我的说法一切正常。
Logcat:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.hamidmadarati.mobilsorgulari.Home.Dashboard.ui.PassengerRecyclerModel at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) at com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) at com.google.firebase.database.DataSnapshot.getValue(DataSnapshot.java:203)
片段:
public class PassengerFragment extends Fragment {
private RecyclerView listVehiclesWeekDay;
private FirebaseRecyclerOptions<PassengerRecyclerModel> options;
private FirebaseRecyclerAdapter<PassengerRecyclerModel, PassengerMyViewHolderRecycler> adapter;
private DatabaseReference databaseReference;
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_passenger, container,false);
listVehiclesWeekDay = view.findViewById(R.id.listVehiclesWeekDay);
listVehiclesWeekDay.setHasFixedSize(true);
listVehiclesWeekDay.setLayoutManager(new LinearLayoutManager(getActivity()));
databaseReference = FirebaseDatabase.getInstance().getReference().child("Travels").child("DaysOfTheWeekSimple");
options = new FirebaseRecyclerOptions.Builder<PassengerRecyclerModel>().setQuery(databaseReference, PassengerRecyclerModel.class).build();
adapter = new FirebaseRecyclerAdapter<PassengerRecyclerModel, PassengerMyViewHolderRecycler>(options){
@Override
protected void onBindViewHolder(@NonNull PassengerMyViewHolderRecycler holder, int position, @NonNull PassengerRecyclerModel model) {
if (model.getDay() != null){
holder.titleTextView.setText(model.getDay());
}
}
@Override
public PassengerMyViewHolderRecycler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerow, parent, false);
return new PassengerMyViewHolderRecycler(view);
}
};
adapter.startListening();
listVehiclesWeekDay.smoothScrollToPosition(0);
listVehiclesWeekDay.setAdapter(adapter);
adapter.notifyDataSetChanged();
return view;
}
}
Class:
public class PassengerRecyclerModel {
private String day; //name
public PassengerRecyclerModel() {
//Empty - for Firebase Database
}
// model
public PassengerRecyclerModel(String day) {
this.day = day;
}
//Getter and Setter
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
}
当您传递以下参考时:
databaseReference = FirebaseDatabase.getInstance().getReference().child("Travels").child("DaysOfTheWeekSimple");
连同“PassengerRecyclerModel”class 到 FirebaseRecyclerOptions.Builder 的“setQuety()”方法,意味着您想使用 Firebase-UI 库来显示所有“PassengerRecyclerModel” " 对象存在于:
Travels -> DaysOfTheWeekSimple
这实际上是不可能的,因为在该引用下它只存在一个 String 类型的子项,因此出现以下错误:
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.hamidmadarati.mobilsorgulari.Home.Dashboard.ui.PassengerRecyclerModel
要解决这个问题,您需要在“DaysOfTheWeekSimple”节点下添加一个额外的关卡。这可以使用 DatabaseReference 的 push() 方法简单地实现。所以当你在上面的引用处添加一个对象时,像这样添加它:
databaseReference.push().setValue(passengerRecyclerModel);
这样,您的数据库架构应该如下所示:
Firebase-root
|
--- Travels
|
--- DaysOfTheWeekSimple
|
--- $pushedId
|
--- day: "Day 5: 22-4-2021"
获取数据的代码可以保持不变
编辑:
根据您的评论:
Nope, in fact, we do not create data
如果直接在 Firebase 控制台中添加数据,将无法使用 push()。如果您不想以编程方式添加数据,仍然需要额外的层级。因此,在这种情况下,在“DaysOfTheWeekSimple”节点和“day”属性 之间,添加另一个至少包含日期或 ID 的节点,如下所示:
Firebase-root
|
--- Travels
|
--- DaysOfTheWeekSimple
|
--- 22-4-2021 //Extra level added
|
--- day: "Day 5: 22-4-2021"
the problem is when it is obtained and firebase thinks it is an object and does not convert it to a string
不“思考”,对象的类型为“PassengerRecyclerModel”,应在适配器中相应地读取。