Android可编辑个人资料页Firebase更新失效,有没有更简单的实现方案?
问题分析与实现方案
原有代码核心问题
- 判断逻辑完全反向:所有
isXXXChanged方法中,仅当旧值与新输入值完全相等时才执行更新操作,等于没修改才会触发写数据,修改了反而不执行,这是数据不更新的核心原因 - Firebase节点路径错误:使用可变的字段值(比如用户名、手机号)作为用户节点的key,一旦用户修改对应字段,后续就无法定位到原来的用户数据节点,正确应该用用户唯一固定标识(如登录UID、本地存储的固定用户ID)作为根节点
- 字段对应逻辑错误:比如
isAddChanged方法里拿手机号_NUMBER和输入的手机号对比,却要更新地址字段,字段匹配完全错误 - 跳转时机错误:Firebase写数据是异步操作,你在点击更新后就直接跳转,数据还没完成写入就离开了页面,自然不会触发更新
最简单实现方案(本地存储,无需后端)
如果只需要本地保存修改内容,用SharedPreferences足够,代码量比原有实现精简90%:
1. 页面初始化时读取已有数据
// 初始化SharedPreferences SharedPreferences sp = getSharedPreferences("user_profile", MODE_PRIVATE); // 读取所有字段,无存储值时默认填充空串 editName.setText(sp.getString("name", "")); editNum.setText(sp.getString("phone", "")); editAdd.setText(sp.getString("address", "")); editAge.setText(sp.getString("age", "")); editBday.setText(sp.getString("birthday", "")); editBType.setText(sp.getString("blood_type", "")); editComorb.setText(sp.getString("comorbidity", ""));
2. 点击更新统一保存所有内容
不需要写多个判断方法,直接一次性读取所有输入内容保存即可:
public void update(View view){ SharedPreferences.Editor editor = sp.edit(); editor.putString("name", editName.getText().toString().trim()); editor.putString("phone", editNum.getText().toString().trim()); editor.putString("address", editAdd.getText().toString().trim()); editor.putString("age", editAge.getText().toString().trim()); editor.putString("birthday", editBday.getText().toString().trim()); editor.putString("blood_type", editBType.getText().toString().trim()); editor.putString("comorbidity", editComorb.getText().toString().trim()); // 异步提交保存 editor.apply(); Toast.makeText(this, "资料更新成功", Toast.LENGTH_LONG).show(); // 需要跳转的话在此处执行跳转逻辑即可 }
云端同步方案(Firebase修正版)
如果需要多端同步数据,修正原有Firebase逻辑即可正常使用:
// 初始化时用用户固定UID作为节点,不要用可变的字段值当节点 // 需确保已接入Firebase Auth,此处uid为登录后返回的唯一固定标识 String uid = FirebaseAuth.getInstance().getCurrentUser().getUid(); reference = FirebaseDatabase.getInstance("https://backend-d820a-default-rtdb.firebaseio.com/").getReference("user").child(uid); // 点击更新方法 public void update(View view){ // 用Map批量封装所有要更新的字段 Map<String, Object> updateMap = new HashMap<>(); updateMap.put("name", editName.getText().toString().trim()); updateMap.put("num", editNum.getText().toString().trim()); updateMap.put("add", editAdd.getText().toString().trim()); updateMap.put("age", editAge.getText().toString().trim()); updateMap.put("bday", editBday.getText().toString().trim()); updateMap.put("btype", editBType.getText().toString().trim()); updateMap.put("comorb", editComorb.getText().toString().trim()); // 批量更新,监听写入结果 reference.updateChildren(updateMap).addOnCompleteListener(task -> { if(task.isSuccessful()){ Toast.makeText(this, "资料更新成功", Toast.LENGTH_LONG).show(); // 写入成功后再执行跳转,不要提前跳转 finish(); // 或者跳转到主Activity }else{ Toast.makeText(this, "更新失败:" + task.getException().getMessage(), Toast.LENGTH_LONG).show(); } }); }
内容的提问来源于stack exchange,提问作者FanBoySoo WP
相关产品推荐
相关产品推荐

