You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 04:45:57