Android Firebase onDataChange崩溃: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当成两个不同的属性,从而抛出冲突错误。而且这个构造方法是空实现,没有给任何字段赋值,完全是无效代码。
修复步骤
移除冲突的构造方法
修改你的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; } }检查字段拼写匹配
注意到你@PropertyName标注的"FirsName"可能是拼写错误,应该是"FirstName"吧?如果数据库里的字段是FirstName,这个拼写错误会导致无法正确映射,记得修正成和数据库字段完全一致的名称(包括大小写)。处理数据库权限潜在问题
你的数据库规则里,users/$user_id的.read权限是auth.uid === $user_id,这意味着当前用户只能读取自己的用户数据,无法读取其他用户的数据。如果你的需求是展示所有用户,需要修改规则(比如开放users节点的读权限,或者使用Firebase云函数来获取用户列表),否则后续会出现权限被拒绝的错误。
验证修复
修改完成后重新运行App,Firebase就能正常将用户数据反序列化为User对象,RecyclerView也能通过UserAdapter展示排除当前用户的所有用户列表了。
内容的提问来源于stack exchange,提问作者Cosmin Zahariea

