如何修改代码实现更新当前用户而非创建新用户?
解决Firebase数据库更新当前用户信息的问题
嘿,我来帮你调整这段代码,让它能正确更新当前用户的信息而不是创建新用户。先看看原代码里的问题:你现在的数据库引用指向的是Threads Users/Threads Users这个固定路径,每次调用setValue()都会往这个路径写数据,相当于覆盖或者创建这个节点,而不是定位到当前用户的专属记录。
核心思路
要更新当前用户的信息,关键是找到当前用户在数据库中的唯一节点,Firebase通常用用户的UID(从Firebase Auth获取)作为这个节点的键,这样每个用户都有自己独立的数据路径。
修改后的代码示例
// 初始化数据库引用(规范变量名,符合Java命名习惯) FirebaseDatabase userDatabase = FirebaseDatabase.getInstance(); DatabaseReference userDatabaseRef = userDatabase.getReference().child("Threads Users"); // 获取当前登录用户的UID(必须确保用户已登录,否则getCurrentUser()会返回null) FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser != null) { String currentUserUid = currentUser.getUid(); // 定位到当前用户的专属数据节点 DatabaseReference currentUserRef = userDatabaseRef.child(currentUserUid); // 准备要更新的用户数据 Map<String, String> userData = new HashMap<>(); userData.put("userfirstname", Fname); userData.put("userlastname", Sname); userData.put("userdateofbirth", DOB); userData.put("useraddress", Add); userData.put("userpostcode", Ptd); userData.put("usercardnumber", Cnumber); userData.put("usercardexpirydate", Cdate); userData.put("userccvnumber", CCV); // 注意原代码这里多了个空格,建议去掉 // 全量更新用户节点(会覆盖该节点下的所有现有数据) currentUserRef.setValue(userData) .addOnSuccessListener(aVoid -> { // 更新成功后的操作 Log.d("UserUpdate", "用户信息更新成功"); }) .addOnFailureListener(e -> { // 更新失败的处理 Log.e("UserUpdate", "用户信息更新失败", e); }); } else { // 用户未登录的处理逻辑 Log.w("UserUpdate", "用户未登录,无法更新信息"); }
额外说明
- 如果只需要更新部分字段(比如只改姓名和地址),推荐用
updateChildren()替代setValue(),这样不会覆盖其他未修改的字段:currentUserRef.updateChildren(userData) .addOnSuccessListener(...) .addOnFailureListener(...); - 务必确保用户已经通过Firebase Auth登录,否则
getCurrentUser()会返回null,导致无法获取UID。如果你的场景需要处理未登录状态,可以在这里添加引导用户登录的逻辑。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

