Android向Firebase数据库添加新用户遇问题,附代码求排查
你的新用户添加代码可能存在这些问题,我帮你梳理下
先把你提供的代码整理出来(补全了截断的部分,假设是StringManipulations相关的收尾):
//添加新用户 public void addNewUser(String email, String username, String description, String website, String profile_photo) { User user = new User(email, 1, userID, StringManipulations.condenseUsername(username)); myRef.child(mContext.getString(R.string.dbName_user)) .child(userID) .setValue(user); User_account_settings settings = new User_account_settings(description, username, 0, 0, 0, profile_photo, StringManipulations...); // 看起来这里的代码没写完,应该是要把settings也写入数据库? }
结合这段代码,我猜你遇到的问题大概率和下面这些点有关:
userID没正确生成或初始化:你直接用了userID变量,但没看到它是怎么来的。如果是Firebase数据库的话,正常应该用push().getKey()生成唯一的用户ID,或者从Firebase Auth获取已登录用户的UID。要是userID是空的或者重复了,要么写不进数据,要么会覆盖已有用户的信息。- 实体类的构造或序列化有问题:
User的构造函数传了email, 1, userID, condensedUsername,得确保User类里的属性顺序、类型和构造函数完全对应,而且Firebase序列化需要类有无参构造函数和public的getter方法,少了这些的话,写入会静默失败。 - 代码截断,用户配置信息没写完:你创建了
User_account_settings对象,但代码到一半就断了,如果没把这个配置对象也写入数据库(比如关联到同一个userID的子节点),那用户的资料就不完整,可能让你误以为添加用户失败了。 - 没加错误监听,出问题也不知道:
setValue()是异步操作,你没加addOnFailureListener,就算网络出问题、数据库权限不够、数据格式错了,你也看不到任何报错信息,根本没法定位问题。 - 用户名处理可能有问题:
StringManipulations.condenseUsername处理后的用户名如果是空的,或者包含Firebase不允许的字符(比如.、#、$、[、]),也会导致写入失败。 - 数据库引用
myRef没初始化对:要是myRef是空的,或者没正确指向数据库的根节点,所有写入操作都白做。
给你一个修正后的完整示例,加上了错误监听和规范的逻辑:
// 添加新用户 public void addNewUser(String email, String username, String description, String website, String profile_photo) { // 生成Firebase推荐的唯一用户ID String userID = myRef.child(mContext.getString(R.string.dbName_user)).push().getKey(); if (userID == null) { Log.e("AddUser", "生成用户ID失败"); return; } // 处理并校验用户名合法性 String condensedUsername = StringManipulations.condenseUsername(username); if (condensedUsername.isEmpty() || condensedUsername.contains(".") || condensedUsername.contains("#") || condensedUsername.contains("$") || condensedUsername.contains("[") || condensedUsername.contains("]")) { Log.e("AddUser", "用户名格式不合法,不能包含特殊字符"); return; } // 创建用户基本信息对象 User user = new User(email, 1, userID, condensedUsername); // 创建用户配置信息对象 User_account_settings settings = new User_account_settings(description, username, 0, 0, 0, profile_photo, condensedUsername); // 先写入用户基本信息,成功后再写配置信息 myRef.child(mContext.getString(R.string.dbName_user)) .child(userID) .setValue(user) .addOnSuccessListener(aVoid -> { Log.d("AddUser", "用户基本信息保存成功"); // 写入用户配置信息 myRef.child(mContext.getString(R.string.dbName_user_settings)) .child(userID) .setValue(settings) .addOnSuccessListener(aVoid1 -> Log.d("AddUser", "用户配置信息保存成功")) .addOnFailureListener(e -> Log.e("AddUser", "保存用户配置失败:" + e.getMessage())); }) .addOnFailureListener(e -> Log.e("AddUser", "保存用户基本信息失败:" + e.getMessage())); }
建议你先给现有代码加上错误监听,看看Logcat里的报错信息,这是最快定位问题的方法。另外记得检查User和User_account_settings类有没有无参构造函数,所有属性是不是都有public的getter~
内容的提问来源于stack exchange,提问作者Kartik Mishra
相关产品推荐
相关产品推荐

