Android Studio中Firebase搜索报错:无法将String转为Fly类
Firebase搜索特定条目报错排查与解决
RecyclerView可正常显示数据,但搜索Firebase中特定条目时抛出类型转换异常,错误提示无法将java.lang.String转为自定义的Fly实体类。
相关代码
recyclerView= findViewById(R.id.recycleview); getmRootFLY = FirebaseDatabase.getInstance().getReference("FLY"); list = new ArrayList<>(); arrayList = new ArrayList<>(); recyclerView.setLayoutManager(new LinearLayoutManager(this)); myAdapter = new MyAdapter(this,list); recyclerView.setAdapter(myAdapter); getmRootFLY.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { for (DataSnapshot dataSnapshot: snapshot.getChildren()) { Fly fly = dataSnapshot.getValue(Fly.class); list.add(fly); } myAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { } }); // 搜索功能代码 DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("FLY").child("-NJzbEcGdb8_fvLxWFJk"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { list.clear(); for (DataSnapshot dataSnapshot1: dataSnapshot.getChildren()) { Fly fly = dataSnapshot1.getValue(Fly.class); list.add(fly); } myAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { } });
控制台报错信息
com.google.firebase.database.DatabaseException: Can't convert object of type java.lang.String to type com.example.newp.Fly 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) at com.example.newp.MainActivity$4$1.onDataChange(MainActivity.java:150) at com.google.firebase.database.core.ValueEventRegistration.fireEvent(ValueEventRegistration.java:75) at com.google.firebase.database.core.view.DataEvent.fire(DataEvent.java:63) at com.google.firebase.database.core.view.EventRaiser$1.run(EventRaiser.java:55) at android.os.Handler.handleCallback(Handler.java:942) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7872) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:548) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:936)
数据库结构说明
FLY节点下的每个子节点(如-NJzbEcGdb8_fvLxWFJk)直接存储着Fly对象的所有属性(name、phone等字段),而非嵌套的子节点结构。
问题原因与解决
问题原因
搜索代码中,dataSnapshot已经是对应单个Fly对象的节点,却错误地遍历它的子节点(这些子节点是Fly的属性,类型为String/基本数据类型),强行将属性值转为Fly类,导致类型转换异常。
修正后的搜索代码
DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("FLY").child("-NJzbEcGdb8_fvLxWFJk"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot) { list.clear(); // 直接从当前节点获取Fly对象,无需遍历子节点 Fly fly = dataSnapshot.getValue(Fly.class); if(fly != null){ list.add(fly); } myAdapter.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 添加错误处理,方便排查问题 Log.e("FirebaseError", error.getMessage()); } });
内容的提问来源于stack exchange,提问作者derey yovel
相关产品推荐
相关产品推荐

