无法将 java.lang.String 类型的对象转换为类型 - FirebaseUI
Posted
技术标签:
【中文标题】无法将 java.lang.String 类型的对象转换为类型 - FirebaseUI【英文标题】:Can't convert object of type java.lang.String to type - FirebaseUI 【发布时间】:2021-07-16 14:01:18 【问题描述】:我不明白问题是什么,据我说一切正常。
Logcat:
com.google.firebase.database.DatabaseException:无法将 java.lang.String 类型的对象转换为 com.hamidmadarati.mobilsorgulari.Home.Dashboard.ui.PassengerRecyclerModel 类型 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertBean(CustomClassMapper.java:436) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.deserializeToClass(CustomClassMapper.java:232) 在 com.google.firebase.database.core.utilities.encoding.CustomClassMapper.convertToCustomClass(CustomClassMapper.java:80) 在 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;
类:
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;
【问题讨论】:
您好,请编辑您的问题并以文本格式而不是屏幕截图添加您的代码。 我在将对象转换为带有 firebase 类的字符串时遇到问题,代码已附加 【参考方案1】:当您传递以下参考时:
databaseReference = FirebaseDatabase.getInstance().getReference().child("Travels").child("DaysOfTheWeekSimple");
与 FirebaseRecyclerOptions.Builder 的“setQuety()”方法中的“PassengerRecyclerModel”类一起,意味着您要使用 Firebase-UI 库来显示其中存在的所有“PassengerRecyclerModel”对象:
Travels -> DaysOfTheWeekSimple
这实际上是不可能的,因为在该引用下它只存在一个字符串类型的子项,因此出现以下错误:
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"
获取数据的代码可能保持不变。
编辑:
根据您的 cmets:
不,事实上,我们不创建数据
如果您直接在 Firebase 控制台中添加数据,您将无法使用 push()。如果您不想以编程方式添加数据,则仍然需要额外的层级。因此,在这种情况下,在“DaysOfTheWeekSimple”节点和“day”属性之间,添加另一个至少包含日期或 Id 的节点,如下所示:
Firebase-root
|
--- Travels
|
--- DaysOfTheWeekSimple
|
--- 22-4-2021 //Extra level added
|
--- day: "Day 5: 22-4-2021"
问题是当它被获取并且firebase认为它是一个对象并且不将它转换为字符串时
不“思考”,对象属于“PassengerRecyclerModel”类型,应在适配器中相应读取。
【讨论】:
在完全相同的部分你已经有了对象的加法操作,对吧? 这是产生错误的代码,我在代码的哪个部分添加这个push?警察:谢谢! i.stack.imgur.com/xAwT3.png 如何将数据添加到数据库中?您在代码中的哪个位置使用 setValue()?应该替换该代码,否则,您的实际代码将继续产生错误。 不,实际上我们不创建数据,但是我们得到它来显示它,问题是当它被获取并且firebase认为它是一个对象并且不将它转换为一个字符串跨度> 原来错误是引用,您的解决方案是正确的,您必须添加一个额外的值,推动它使其工作并且在获取数据时不会崩溃,谢谢以上是关于无法将 java.lang.String 类型的对象转换为类型 - FirebaseUI的主要内容,如果未能解决你的问题,请参考以下文章
如何修复错误:无法将类型“java.lang.String”的值转换为所需类型“java.lang.Long”;
无法将 java.lang.String 类型的对象转换为 com.example 类型
无法从类型 [java.lang.String] 转换为类型 [java.lang.Long]
无法将类型“java.lang.String”的属性值转换为属性“事务”所需的类型“java.util.List”
无法将类型“java.lang.String”的属性值转换为所需类型“java.util.Date”
无法将 java.lang.String 类型的属性值转换为所需的 java.time.LocalDateTime 类型