Firebase Firestore调用update方法时新增数据而非更新问题求助
核心问题排查
- 执行更新操作时没有传递目标用户的UID,
updateToFireStore方法错误使用当前登录账号(管理员)的UID作为要更新的文档ID,导致要么修改了管理员自身的资料,要么因为目标文档不存在触发报错 - 适配器跳转编辑页时仅传递了用户基础信息,未传递用户唯一UID,编辑页无法定位要修改的目标用户
- 密码长度校验逻辑缺失
return,密码不足8位时仍会继续执行后续的保存/更新逻辑 - 客户端使用
createUserWithEmailAndPassword创建用户会自动切换当前登录态为新创建的用户,管理员身份创建其他用户的逻辑不适合在客户端直接实现,建议后续迁移到Admin SDK后端实现 - 直接修改Firestore中存储的邮箱、密码字段不会同步更新Firebase Auth系统的用户认证信息,用户登录时仍会使用原有认证信息
修复步骤
1. 改造UsersAdapter的updateData方法
你的usersmodel类中必然存储了每个用户的UID字段,先为该类添加getUid()方法获取用户UID,然后修改跳转逻辑传递UID:
public void updateData(int position){ usersmodel item=mList.get(position); Bundle bundle=new Bundle(); bundle.putString("uId", item.getUid()); // 新增传递目标用户UID bundle.putString("uName",item.getfName()); bundle.putString("uEmail",item.getEmail()); bundle.putString("uPhone",item.getPhone()); bundle.putString("uPassword",item.getPassword()); Intent intent=new Intent(activity,Admin_add.class); intent.putExtras(bundle); activity.startActivity(intent); }
2. 改造Admin_add类接收目标用户UID
新增变量存储目标用户UID,在onCreate中接收传递过来的UID:
// 新增变量 private String targetUserId; @Override protected void onCreate(Bundle savedInstanceState) { // 原有初始化逻辑不变 Bundle bundle=getIntent().getExtras(); if(bundle!=null){ mAddBtn.setText("update"); targetUserId = bundle.getString("uId"); // 接收目标用户UID uName=bundle.getString("uName"); uEmail=bundle.getString("uEmail"); uPhone=bundle.getString("uPhone"); uPassword=bundle.getString("uPassword"); mFullName.setText(uName); mPhone.setText(uPhone); mEmail.setText(uEmail); mPassword.setText(uPassword); }else{ mAddBtn.setText("save"); } // 原有逻辑不变 }
3. 修复updateToFireStore方法
修改更新逻辑使用传递过来的目标用户UID,不要使用当前登录用户的UID:
private void updateToFireStore(String fullname, String email, String password, String phone) { // 删掉原有获取当前登录用户UID的代码,使用targetUserId fStore.collection("users").document(targetUserId).update("email",email,"Password",password,"fName",fullname,"phone",phone) // 原有监听逻辑不变 }
4. 修复密码校验逻辑
在密码长度判断后添加return,避免校验不通过仍执行后续逻辑:
if (password.length() < 8) { mPassword.setError("Password must be>=8 characters"); return; // 新增return终止后续逻辑 }
内容的提问来源于stack exchange,提问作者Xoryy
相关产品推荐
相关产品推荐

