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

Android Firebase onDataChange崩溃:RecyclerView展示用户列表失败

解决Firebase反序列化冲突与RecyclerView展示用户问题

先看你给出的崩溃日志,核心错误是com.google.firebase.database.DatabaseException: Found two getters or fields with conflicting case sensitivity for property: secondname,这个问题出在你的User实体类里,和Firebase的对象映射逻辑直接相关。

错误原因

Firebase在将数据库JSON转换为Java对象时,会通过反射扫描类的字段、构造方法参数和getter/setter来匹配属性。你的User类里有一个完全多余的构造方法:

public User (String firstname, String secondname) { }

这个构造方法的参数secondname(小写字母n),和你定义的字段secondName(大写字母N)、以及标注了@PropertyName("SecondName")的getter/setter产生了大小写冲突——Firebase会把secondname和secondName当成两个不同的属性,从而抛出冲突错误。而且这个构造方法是空实现,没有给任何字段赋值,完全是无效代码。

修复步骤

  1. 移除冲突的构造方法
    修改你的User类,删掉这个空的构造方法,修改后的代码如下:

    public class User {
        public String firstName;
        public String secondName;
        public String uid;
        public String email;
    
        public User(){ }
    
        public User (String firstName, String secondName, String uid, String email) {
            this.firstName = firstName;
            this.secondName = secondName;
            this.uid=uid;
            this.email=email;
        }
    
        @PropertyName ( "FirsName" )
        public String getFirstName () { return firstName; }
    
        @PropertyName ("SecondName" )
        public String getSecondName () { return secondName; }
    
        @PropertyName ( "Uid" )
        public String getUid () { return uid; }
    
        @PropertyName ( "E-mail" )
        public String getEmail () { return email; }
    
        @PropertyName ( "FirsName" )
        public void setFirstName (String firstName) { this.firstName = firstName; }
    
        @PropertyName ( "SecondName" )
        public void setSecondName (String secondName) { this.secondName = secondName; }
    
        @PropertyName ( "Uid" )
        public void setUid (String uid) { this.uid = uid; }
    
        @PropertyName ( "E-mail" )
        public void setEmail (String email) { this.email = email; }
    }
    
  2. 检查字段拼写匹配
    注意到你@PropertyName标注的"FirsName"可能是拼写错误,应该是"FirstName"吧?如果数据库里的字段是FirstName,这个拼写错误会导致无法正确映射,记得修正成和数据库字段完全一致的名称(包括大小写)。

  3. 处理数据库权限潜在问题
    你的数据库规则里,users/$user_id的.read权限是auth.uid === $user_id,这意味着当前用户只能读取自己的用户数据,无法读取其他用户的数据。如果你的需求是展示所有用户,需要修改规则(比如开放users节点的读权限,或者使用Firebase云函数来获取用户列表),否则后续会出现权限被拒绝的错误。

验证修复

修改完成后重新运行App,Firebase就能正常将用户数据反序列化为User对象,RecyclerView也能通过UserAdapter展示排除当前用户的所有用户列表了。

内容的提问来源于stack exchange,提问作者Cosmin Zahariea

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:53:34